我有一个List<MyClass>
,我希望按MyClass的DateTime CreateDate
属性对其进行排序。
LINQ可以吗?
谢谢
答案 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));