J'ai une liste que je dois trier par DateTime, la classe MyStuff ressemble à:
public class MyStuff
{
public int Type {get;set;}
public int Key {get;set;}
public DateTime Created {get;set;}
}
Je dois pouvoir trier la liste de collections par le champ Created (DateTime).
Vous semblez travailler avec un objet List<T>
, auquel cas la méthode la plus efficace (et la plus simple) serait la suivante:
myList.Sort((x, y) => DateTime.Compare(x.Created, y.Created));
Ceci utilise la surcharge de la méthode List.Sort qui prend un délégué Comparison<T>
(et donc une expression lambda).
Vous pouvez bien sûr utiliser la méthode d’extension LINQ OrderBy
, mais je ne pense pas que cela offre des avantages et peut être beaucoup plus lent, selon votre situation.
myList = myList.OrderBy(x => x.Created).ToList();
var query =
from m in mystuffcollection
orderby m.Created ascending
select m;
Vous pouvez utiliser using System.Linq;
à partir du framework entity, en considérant que vous utilisez un noyau .net dans votre application. Linq fournit les méthodes FilterBy et OrderBy. Pour personnaliser FilterBy et OrderBy, vous devez remplacer les méthodes de votre classe ou de votre référentiel.
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;
}
}