排序自定义类列表 < T >

我想用 date属性对我的列表进行排序。

这是我定制的课程:

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属性对 List进行排序。 日期的格式为 dd.MM.yyyy

我读过一些关于 IComparable接口的东西,但是我不知道如何使用它。

156250 次浏览

查看 List 类的重载排序方法。 其中之一: 您的自定义类必须实现 ICompable 接口,然后您可以使用 List 类的 Sort 方法。

一种方法是使用 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); });

你是对的-你需要实现 ICombitable。要做到这一点,只需声明你的类:

public MyClass : IComparable
{
int IComparable.CompareTo(object obj)
{
}
}

在 CompareTo 中,只需要实现自定义比较算法(可以使用 DateTime 对象来实现这一点,但是要确保首先检查“ obj”的类型)。有关更多信息,请参见 给你给你

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

你可以使用 linq:

var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag;
List<cTag> Sorted = q.ToList()

对于这种情况,您还可以使用 LINQ 进行排序:

week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();

首先,如果 date 属性存储日期,则使用 DateTime 存储它。如果您通过排序来解析日期,那么您必须为被比较的每个项目解析日期,这不是非常有效..。

然后你可以创建一个 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;
});

你是正确的,你的 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);
}
}

但是,这样排序不会很好,因为这将使用经典的字符串排序(因为您将 date 声明为 string)。因此,我认为最好的办法是重新定义类,并将 date 声明为 DateTime 而不是 string。代码几乎保持不变:

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

在创建类的实例时,只需要将包含日期的字符串转换为 DateTime 类型,但这很容易做到,例如,通过 DateTime.Parse(String)方法。

谢谢你的快速回答。

这是我的解决办法:

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