2010-01-25 12 views

Répondre

5

Si vous connaissez le propertyname avant la compilation:

myList = myList.OrderBy(a=>a.propertyName).ToList(); 

ou

myList = (from m in myList order by m.propertyName).ToList(); 

Si vous ne possédez pas la propriété au moment de la compilation (par exemple le tri dynamique dans un grille ou quelque chose); essayez les méthodes d'extension suivantes:

static class OrderByExtender 
{ 
    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> collection, string key, string direction) 
    { 
     LambdaExpression sortLambda = BuildLambda<T>(key); 

     if(direction.ToUpper() == "ASC") 
      return collection.OrderBy((Func<T, object>)sortLambda.Compile()); 
     else 
      return collection.OrderByDescending((Func<T, object>)sortLambda.Compile()); 
    } 

    public static IOrderedEnumerable<T> ThenBy<T>(this IOrderedEnumerable<T> collection, string key, string direction) 
    { 
     LambdaExpression sortLambda = BuildLambda<T>(key); 

     if (direction.ToUpper() == "ASC") 
      return collection.ThenBy((Func<T, object>)sortLambda.Compile()); 
     else 
      return collection.ThenByDescending((Func<T, object>)sortLambda.Compile()); 
    } 

    private static LambdaExpression BuildLambda<T>(string key) 
    { 
     ParameterExpression TParameterExpression = Expression.Parameter(typeof(T), "p"); 
     LambdaExpression sortLambda = Expression.Lambda(Expression.Convert(Expression.Property(TParameterExpression, key), typeof(object)), TParameterExpression); 
     return sortLambda; 
    } 
} 

pour ensuite comme

myList = myList.OrderBy("propertyName", "ASC").ToList(); 
+0

Je connais le nom de la propriété, et ce que j'ai immédiatement été dans mon esprit, mais le problème que je n'ai pas la fonction OrderBy! –

+1

Tant que vous avez une instruction 'using System.Linq' au sommet de votre classe, ceci fonctionnera. –

+0

Oui, il semble que j'ai raté la référence. Merci. –

1
var list = (from t in list 
      orderby t.doubleVal).ToList(); 
+0

Ce n'est pas une affectation juridique si ' liste' est une 'Liste '; le type de retour de 'Enumerable .OrderBy' est' IEnumerable '. – jason

+0

Merci pour la correction, ma connaissance de la syntaxe C# est rouillée car je m'en tiens principalement à VB.NET. – Daniel

+0

Maintenant, votre réponse ne trie pas la liste, elle produit un 'IEnumerable ' qui peut être énuméré pour obtenir une version ordonnée de la liste. – jason

0

Je pense que ce sould faire l'affaire:

List<T> list = new List<T>(); 
//fill list here  
list.OrderBy(item => item.DoubleTypeProperty).ToList(); 

HTH

+0

J'ai oublié le 'ToList()'. –

+1

Cela ne trie pas la liste; il produit un 'IEnumerable ' qui peut être énuméré pour obtenir une version ordonnée de la liste. – jason

+0

@Jan - Cela dépend de ce que vous voulez faire avec le résultat. –