web-dev-qa-db-fra.com

comment trier une collection par date/heure en c #

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).

36
user195968

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();
78
Noldorin
var query = 
    from m in mystuffcollection
    orderby m.Created ascending
    select m;
7
popester

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;
                 }
                }
0
Darleison Rodrigues