2010-02-16 5 views
3

J'ai un List<MyClass> et je veux le trier par DateTime CreateDate attribut de MyClass.Trier une liste de classe avec LINQ

Est-ce possible avec LINQ?

Merci

+0

-vous par le CreateDate de la propriété qui est de type DateTime? –

+0

oui je voulais dire la propriété – Kubi

Répondre

4

Vous pouvez énumérer dans l'ordre de tri:

IEnumerable<MyClass> result = list.OrderBy(element => element.CreateDate); 

Vous pouvez également utiliser ToList() pour convertir à une nouvelle liste et réassigner à la variable d'origine:

list = list.OrderBy(element => element.CreateDate).ToList(); 

Cette n'est pas tout à fait la même chose que le tri de la liste originale, car si quelqu'un a encore une référence à l'ancienne liste, il ne verra pas la nouvelle commande. Si vous souhaitez réellement trier la liste d'origine, vous devez utiliser la méthode List<T>.Sort.

+0

Comment puis-je mettre les dernières sur le dessus? par asc? – Kubi

+1

'OrderByDescending' au lieu de' OrderBy' –

+0

+1. superbe, merci de poster ceci. – adrianos

1

Voici un exemple:

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; } 
    } 
} 
+1

"Avez-vous essayé d'utiliser linq?" LOL - c'est la question! – Aaronaught

+0

Ya c'était une faute de frappe ... lol – anthonyv

0

Bien sûr, les autres réponses avec le travail .OrderBy(), mais cela ne vous fera pas plutôt votre article source de IComparable et héritera simplement appeler .Sort()?

5

Pour trier la existante liste:

list.Sort((x,y) => x.CreateDate.CompareTo(y.CreateDate)); 

Il est également possible d'écrire une méthode d'extension Sort, ce qui permet:

list.Sort(x => x.CreateDate); 

par exemple:

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))); 
    } 
} 
+0

+1 pour le montrer – Kubi

0
 class T { 
      public DateTime CreatedDate { get; set; } 
     } 

à utiliser:

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