Как сортировать коллекцию по дате в С#
У меня есть список, который мне нужно сортировать по DateTime, класс MyStuff выглядит так:
public class MyStuff
{
public int Type {get;set;}
public int Key {get;set;}
public DateTime Created {get;set;}
}
Мне нужно иметь возможность сортировать список коллекции по полю Created (DateTime).
Ответы
Ответ 1
Кажется, вы работаете с объектом List<T>
, и в этом случае наиболее эффективным (и простым) методом будет следующее:
myList.Sort((x, y) => DateTime.Compare(x.Created, y.Created));
Это использует перегрузку метода List.Sort, чем принимает делегат Comparison<T>
(и, следовательно, лямбда-выражение).
Конечно, вы можете использовать метод расширения LINQ OrderBy
, но я не думаю, что это дает какие-либо преимущества и может быть значительно медленнее, в зависимости от вашей ситуации.
myList = myList.OrderBy(x => x.Created).ToList();
Ответ 2
var query =
from m in mystuffcollection
orderby m.Created ascending
select m;
Ответ 3
Вы можете использовать using System.Linq;
из сущности, учитывая, что вы используете ядро .net в вашем приложении. 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;
}
}