C# 如何对列表进行排序<;T>;,通过它的任何属性?

C# 如何对列表进行排序<;T>;,通过它的任何属性?,c#,linq,sorting,generics,reflection,C#,Linq,Sorting,Generics,Reflection,我正在尝试使用OrderBy,OrderByDescending对列表进行排序,其中T是一个自定义类。 代码: 列表顺序基于T的任何属性 class BigRoom { var Room = new Room(new List<Something>()); } class Room<T> where T: class, new() { List<T> baseList; public Room(List<T> listP

我正在尝试使用
OrderBy
OrderByDescending
列表进行排序,其中
T
是一个自定义类。 代码:

列表顺序基于
T
的任何属性

class BigRoom
{
    var Room = new Room(new List<Something>());
}

class Room<T> where T: class, new()
{
    List<T> baseList;

    public Room(List<T> listPar)
    {
        baseList = listPar;

        var prop = /* get any property from T with reflection... */

        // How to set a comparer here, if we know prop (type, value...)
        baseList.Sort(...);

        // go do something with reordered list
    }
}

但是当获取
prop
值时,它会返回一个
对象
,它没有实现
CompareTo()
,如果可以的话,我将不胜感激。

objectlist是一个对象列表,您希望根据状态、客户名称、公司名称、账单地址进行排序

        objectlist.Sort(delegate(Object a, Object b)
        {
            if (String.CompareOrdinal(a.Status, b.Status) == 0)
            {
                return String.CompareOrdinal(a.CustomerName, b.CustomerName) == 0 ? String.CompareOrdinal(a.CompanyName, b.CompanyName) : String.CompareOrdinal(a.BillingAddress, b.BillingAddress);
            }
            if (a.Status.Equals("Very Important!")) { return -1; }
            if (b.Status.Equals("Very Important!")) { return 1; }
            if (a.Status.Equals("Important")) { return -1; }
            if (b.Status.Equals("Important")) { return 1; }
            if (a.Status.Equals("Not Important")){ return -1; }
            return 1;
        });
假设对象列表中的条目具有以下属性:

地位, 客户名称, 公司名称, 帐单地址

        objectlist.Sort(delegate(Object a, Object b)
        {
            if (String.CompareOrdinal(a.Status, b.Status) == 0)
            {
                return String.CompareOrdinal(a.CustomerName, b.CustomerName) == 0 ? String.CompareOrdinal(a.CompanyName, b.CompanyName) : String.CompareOrdinal(a.BillingAddress, b.BillingAddress);
            }
            if (a.Status.Equals("Very Important!")) { return -1; }
            if (b.Status.Equals("Very Important!")) { return 1; }
            if (a.Status.Equals("Important")) { return -1; }
            if (b.Status.Equals("Important")) { return 1; }
            if (a.Status.Equals("Not Important")){ return -1; }
            return 1;
        });

希望这有帮助。=)

这应该可以让你开始了。如果值为null,即未设置或不可比较,则需要实际清理
Compare
方法来处理,这是实际能够进行比较所必需的

PropertyInfo myPropertyFromReflection = GetMyPropertySomehow();
myList.Sort(new MyComparer<TransactionRequest>(myPropertyFromReflection));


public class MyComparer<T> : IComparer<T>
{
    PropertyInfo _sortBy;
    public MyComparer(PropertyInfo sortBy)
    {
        _sortBy = sortBy;
    }

    public int Compare(T x, T y)
    {
        var xValue = _sortBy.GetValue(x) as IComparable;
        var yValue = _sortBy.GetValue(y) as IComparable;

        return xValue.CompareTo(yValue);
    }
}
PropertyInfo myPropertyFromReflection=GetMyPropertySomehow();
排序(新的MyComparer(myPropertyFromReflection));
公共类MyComparer:IComparer
{
不动产信息;
公共MyComparer(财产信息分类)
{
_sortBy=sortBy;
}
公共整数比较(TX,TY)
{
var xValue=_sortBy.GetValue(x)作为IComparable;
var yValue=_sortBy.GetValue(y)作为IComparable;
返回xValue.CompareTo(yValue);
}
}

您的房间构造函数可以这样实现(注意,我添加了一个随机变量,例如,您可以选择您喜欢的属性):

使用System.ComponentModel;
公共房间(列表)
{
Random r=新的Random(Environment.TickCount);
baseList=listPar;
var props=TypeDescriptor.GetProperties(typeof(T));
PropertyDescriptor prop=props[r.Next(props.Count)];
//如果我们知道属性(类型、值…),如何在这里设置比较器
排序((x,y)=>prop.GetValue(x.ToString().CompareTo(prop.GetValue(y.ToString()));
//对重新排序的列表执行某些操作
}

因此,如果propertydescriptor指向Fingers属性,例如,它将使用string类的compareTo按这些值排序。

我看不出这有什么帮助-因为OP必须事先知道每个可能的属性名称,要排序的内容可能存在的类型和值…您是否能够在
T
上实现
IComparable
?@DStanley好的,我想知道如果没有
OrderBy
,是否可能,以避免多次重新设计
baseList
,排序在我的项目中将是非常恒定的,我想将性能与
OrderBy
方法进行比较…@Tomcat AFAIK
OrderBy
使用,如果您想要性能,我可能会这样做(特别是如果您得到的是您一无所知的T)。排序在我的项目中将是非常恒定的,如果是这样的话,我认为你应该考虑一些重新设计,或者让一个DB(如果存在的话)为你做这件事,为什么不使用这个:@任何一个属性都将是“不变的”。
PropertyInfo myPropertyFromReflection = GetMyPropertySomehow();
myList.Sort(new MyComparer<TransactionRequest>(myPropertyFromReflection));


public class MyComparer<T> : IComparer<T>
{
    PropertyInfo _sortBy;
    public MyComparer(PropertyInfo sortBy)
    {
        _sortBy = sortBy;
    }

    public int Compare(T x, T y)
    {
        var xValue = _sortBy.GetValue(x) as IComparable;
        var yValue = _sortBy.GetValue(y) as IComparable;

        return xValue.CompareTo(yValue);
    }
}
using System.ComponentModel;

public Room(List<T> listPar)
{
    Random r = new Random(Environment.TickCount);
    baseList = listPar;
    var props = TypeDescriptor.GetProperties(typeof(T));
    PropertyDescriptor prop = props[r.Next(props.Count)];      

    // How to set a comparer here, if we know prop (type, value...)
     baseList.Sort((x, y) => prop.GetValue(x).ToString().CompareTo(prop.GetValue(y).ToString()));

    // go do something with reordered list
 }