如何根据列表的任何属性对其进行排序
本文关键字:排序 属性 任何 何根 列表 | 更新日期: 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 =)