对自定义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));