如何根据列表的任何属性对其进行排序

本文关键字:排序 属性 任何 何根 列表 | 更新日期: 2023-09-27 18:09:22

我试图排序一个List<T>没有使用OrderBy, OrderByDescending,其中T是一个自定义类。代码:

class Something
{
    public string Category { get; set; }
    public int Fingers { get; set; }
    public DateTime Creation { get; set; }
}

列表顺序它是基于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
    }
}

我可以做到知道T和它的属性,使用lambda表达式或委托。

list.Sort((x, y) => x.CompareTo(y));

但是当获得prop值时,它返回object,它不实现CompareTo(),是否有任何方法实现这一点,如果是这样,我会很感激。

如何根据列表的任何属性对其进行排序

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

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
 }

如果属性描述符指向手指属性,例如它将使用字符串类的comparareto按这些值排序

这应该是您的开始。你需要实际清理Compare方法来处理,如果值是空的,即要么没有设置,要么不是IComparable,这是需要实际能够进行比较。

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);
    }
}

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;
        });

希望这对你有帮助。div =)