使用LINQ对类列表进行排序

时间:2010-02-16 23:29:42

标签: linq

我有一个List<MyClass>,我希望按MyClass的DateTime CreateDate属性对其进行排序。

LINQ可以吗?

谢谢

5 个答案:

答案 0 :(得分:5)

要对现有列表进行排序:

list.Sort((x,y) => x.CreateDate.CompareTo(y.CreateDate));

也可以编写Sort扩展方法,允许:

list.Sort(x => x.CreateDate);

例如:

public static class ListExt {
    public static void Sort<TSource, TValue>(
            this List<TSource> list,
            Func<TSource, TValue> selector) {
        if (list == null) throw new ArgumentNullException("list");
        if (selector == null) throw new ArgumentNullException("selector");
        var comparer = Comparer<TValue>.Default;
        list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
    }
}

答案 1 :(得分:4)

您可以按排序顺序枚举它:

IEnumerable<MyClass> result = list.OrderBy(element => element.CreateDate);

您还可以使用ToList()转换为新列表并重新分配给原始变量:

list = list.OrderBy(element => element.CreateDate).ToList();

这与排序原始列表并不完全相同,因为如果有人仍然对旧列表有引用,则他们将看不到新的排序。如果您确实想要对原始列表进行排序,则需要使用List<T>.Sort方法。

答案 2 :(得分:1)

以下是一个示例:

using System.Collections.Generic;
using System.Linq;

namespace Demo
{ 
    public class Test
    {
        public void SortTest()
        {
            var myList = new List<Item> { new Item { Name = "Test", Id = 1, CreateDate = DateTime.Now.AddYears(-1) }, new Item { Name = "Other", Id = 1, CreateDate = DateTime.Now.AddYears(-2) } };
            var result = myList.OrderBy(x => x.CreateDate);
        }
    }

    public class Item
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public DateTime CreateDate { get; set; }
    }
}

答案 3 :(得分:0)

确保.OrderBy()的其他答案有效,但您是否宁愿让源项继承自IComparable而只是致电.Sort()

答案 4 :(得分:0)

       class T  {
            public DateTime CreatedDate { get; set; }
        }

使用:

List<T> ts = new List<T>(); 
ts.Add(new T { CreatedDate = DateTime.Now }); 
ts.Add(new T { CreatedDate = DateTime.Now }); 
ts.Sort((x,y) => DateTime.Compare(x.CreatedDate, y.CreatedDate));