我有一个List,我需要按DateTime排序,类MyStuff看起来像:
public class MyStuff
{
public int Type {get;set;}
public int Key {get;set;}
public DateTime Created {get;set;}
}
我需要能够通过Created(DateTime)字段对集合List进行排序。
答案 0 :(得分:80)
您似乎正在使用List<T>
对象,在这种情况下,最有效(和简单)的方法如下:
myList.Sort((x, y) => DateTime.Compare(x.Created, y.Created));
这使用List.Sort方法的重载而不是Comparison<T>
委托(因而是lambda表达式)。
您当然可以使用LINQ OrderBy
扩展方法,但我不认为这会带来任何好处,并且可能会明显变慢,具体取决于您的情况。
myList = myList.OrderBy(x => x.Created).ToList();
答案 1 :(得分:7)
var query =
from m in mystuffcollection
orderby m.Created ascending
select m;
答案 2 :(得分:0)
考虑到您在应用程序中使用的是.net core,可以从实体框架使用using System.Linq;
。 Linq为您提供FilterBy和OrderBy方法,对于自定义FilterBy和OrderBy,您需要覆盖类或存储库中的方法。
override
protected IQueryable<myStuff> FilterBy(IQueryable<MyStuff> myProcess, string filterBy, string filterValue)
{
var listFilter = filterBy.Split(',');
var listValues = filterValue.Split(',');
for (int index = 0; index < listFilter.Length; index++)
{
var filter = listFilter[index];
var value = listValues[index];
switch (filter)
{
case "type":
myProcess = myProcess.Where(c => c.Status.Nome.Contains(value));
break;
case "created":
myProcess = myProcess.Where(c => c.Created - DateTime.Parse(value) >= new TimeSpan(0, 0, 0));
default:
break;
}
}
}
override
protected IQueryable<myStuff> OrderBy(IQueryable<MyStuff> myProcess, string attribute, string direction)
{
switch (attribute)
{
case "type":
myProcess = (direction == "asc")
? myProcess.OrderBy(c => c.Type)
: myProcess.OrderByDescending(c => c.Type);
return myProcess;
case "created":
myProcess = (direction == "asc")
? myProcess.OrderBy(c => c.Created)
: myProcess.OrderByDescending(c => c.Created);
return myProcess;
}
}
答案 3 :(得分:0)
对于那些正在寻找一种基于嵌套属性对数据进行排序的方法的人,可以使用如下所示的sort函数:
MyList.Sort((x, y) => x.Datetime.CompareTo(y.Datetime));
现在,使用OrderBy和Sort之间的主要区别是性能和返回值。
排序基本上对现有的List<T>
进行排序,而OrderBy返回一个新的IEnumerable<T>