Cela semble simple mais pas tellement.Comment faire pour trier une liste <T> par double valeur?
Je veux commander une liste basée sur l'une des propriétés de T, qui est de type double.
Cela semble simple mais pas tellement.Comment faire pour trier une liste <T> par double valeur?
Je veux commander une liste basée sur l'une des propriétés de T, qui est de type double.
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();
var list = (from t in list
orderby t.doubleVal).ToList();
Ce n'est pas une affectation juridique si ' liste' est une 'Liste
Merci pour la correction, ma connaissance de la syntaxe C# est rouillée car je m'en tiens principalement à VB.NET. – Daniel
Maintenant, votre réponse ne trie pas la liste, elle produit un 'IEnumerable
Je pense que ce sould faire l'affaire:
List<T> list = new List<T>();
//fill list here
list.OrderBy(item => item.DoubleTypeProperty).ToList();
HTH
J'ai oublié le 'ToList()'. –
Cela ne trie pas la liste; il produit un 'IEnumerable
@Jan - Cela dépend de ce que vous voulez faire avec le résultat. –
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! –
Tant que vous avez une instruction 'using System.Linq' au sommet de votre classe, ceci fonctionnera. –
Oui, il semble que j'ai raté la référence. Merci. –