对自定义class级列表进行sorting<T>
我想用date
属性对我的列表进行sorting。
这是我的习惯class:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Test.Web { public class cTag { public int id { get; set; } public int regnumber { get; set; } public string date { get; set; } } }
这是我想要的List
:
List<cTag> Week = new List<cTag>();
我想要做的是按cTag类的date
属性sorting列表。 date格式为:dd.MM.yyyy。
我读了一些有关IComparable
接口的内容,但不知道如何使用它。
一个办法是与delegate
List<cTag> week = new List<cTag>(); // add some stuff to the list // now sort week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); });
你是正确的,你的cTag类必须实现IComparable<T>
接口。 然后你可以在列表中调用Sort()
。
要实现IComparable<T>
接口,您必须实现CompareTo(T other)
方法。 最简单的方法是调用你想比较的字段的CompareTo方法,在你的情况下是date。
public class cTag:IComparable<cTag> { public int id { get; set; } public int regnumber { get; set; } public string date { get; set; } public int CompareTo(cTag other) { return date.CompareTo(other.date); } }
然而,这不会sorting,因为这将使用经典的stringsorting(因为你声明date为string)。 所以我认为最好的办法是重新定义类,并将date声明为string,而不是DateTime。 代码将保持几乎相同:
public class cTag:IComparable<cTag> { public int id { get; set; } public int regnumber { get; set; } public DateTime date { get; set; } public int CompareTo(cTag other) { return date.CompareTo(other.date); } }
只有在创build类的实例时才能将包含date的string转换为DateTimetypes,但是可以通过DateTime.Parse(String)
方法轻松完成。
对于这种情况,你也可以使用LINQ进行sorting:
week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();
List<cTag> week = new List<cTag>(); Week.Sort((x, y) => DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo( DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture)) );
你是对的 – 你需要实现IComparable。 要做到这一点,只需声明你的类:
public MyClass : IComparable { int IComparable.CompareTo(object obj) { } }
在CompareTo中,您只需实现自定义比较algorithm(您可以使用DateTime对象来执行此操作,但只能确定先检查“obj”的types)。 欲了解更多信息,请参阅这里和这里 。
你可以使用linq:
var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag; List<cTag> Sorted = q.ToList()
首先,如果date属性存储date,则使用DateTime进行存储。 如果通过sorting来parsingdate,则必须对每个要比较的项目进行parsing,这并不是非常高效。
然后你可以做一个IComparer:
public class TagComparer : IComparer<cTag> { public int Compare(cTag first, cTag second) { if (first != null && second != null) { // We can compare both properties. return first.date.CompareTo(second.date); } if (first == null && second == null) { // We can't compare any properties, so they are essentially equal. return 0; } if (first != null) { // Only the first instance is not null, so prefer that. return -1; } // Only the second instance is not null, so prefer that. return 1; } } var list = new List<cTag>(); // populate list. list.Sort(new TagComparer());
你甚至可以做一个代表:
list.Sort((first, second) => { if (first != null && second != null) return first.date.CompareTo(second.date); if (first == null && second == null) return 0; if (first != null) return -1; return 1; });
看一下List类重载的Sort方法。 有一些方法来。 其中之一:你的自定义类必须实现IComparable接口,然后你可以使用List类的Sort方法。
感谢所有的快速答案。
这是我的解决scheme:
Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); });
谢谢
YourVariable.Sort((a,b)=> a.amount.CompareTo(b.amount));