我有一个 List<MyClass>
,我想通过 MyClass 的 DateTime CreateDate
属性对其进行排序。
使用 LINQ 可以实现吗?
谢谢。
我有一个 List<MyClass>
,我想通过 MyClass 的 DateTime CreateDate
属性对其进行排序。
使用 LINQ 可以实现吗?
谢谢。
对现有列表进行排序:
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)));
}
}
IEnumerable<MyClass> result = list.OrderBy(element => element.CreateDate);
ToList()
将其转换为新列表并重新分配给原始变量:list = list.OrderBy(element => element.CreateDate).ToList();
这与对原始列表进行排序不完全相同,因为如果任何人仍然引用旧列表,则不会看到新的排序。如果您实际上想对原始列表进行排序,则需要使用 List<T>.Sort
方法。
OrderByDescending
代替OrderBy
。 - Mark Byers这里是一个示例:
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; }
}
}
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));
其他使用.OrderBy()
的答案也可以,但是你是否更愿意让源项目继承IComparable
并调用.Sort()
呢?