我正在尝试使用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
}
}
我可以使用lambda表达式或委托来了解T
及其属性。
list.Sort((x, y) => x.CompareTo(y));
但是当获得prop
值时,它返回object
,它没有实现CompareTo()
,是否有任何方法可以实现此目的,如果是这样,我将不胜感激。
答案 0 :(得分:0)
这应该让你开始。如果值为null,则需要实际清理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);
}
}
答案 1 :(得分:0)
你的房间构造函数可以像这样实现(注意我添加一个随机的例子,你可以选择你想要的属性):
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
}
因此,如果propertydescriptor指向Fingers属性,例如它将使用字符串类的compareTo按这些值排序。
答案 2 :(得分:-5)
objectlist是您要根据Status排序的对象列表,然后是Customer Name,然后是Company Name,然后是Billing Address
假设对象列表中的条目具有以下属性:
状态, 顾客姓名, 公司名, 帐单地址
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;
});
希望这会有所帮助。 =)