Tri d'une liste à l'aide de Lambda/Linq to objects
J'ai le nom de "trier par propriété" dans une chaîne de caractères. Je vais devoir utiliser Lambda/Linq pour trier la liste des objets.
Ex:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Au lieu d'utiliser un tas de ifs pour vérifier le nom du champ (sortBy), est-il une manière plus propre de faire le tri
- Est un peu au courant de type de données?
- Dupe: stackoverflow.com/questions/606997/...
- Je vois sortBy == "FirstName". A l'OP veux faire .Equals() à la place?
- il n'a probablement moyen de comparer l'égalité, mais je doute qu'il "voulait .Equals()". Typo n'est généralement pas le résultat dans le code qui fonctionne.
- Votre question n'a de sens que si vous pensez qu'il ya quelque chose de mal avec
==
... quoi?
Vous devez vous connecter pour publier un commentaire.
Cela peut être fait comme
L' .NET framework est un moulage de la lambda
(emp1,emp2)=>int
comme unComparer<Employee>.
Cela a l'avantage d'être fortement typé.
list.sort(functionDeclaredElsewhere)
Une chose que vous pourriez faire est de changer
Sort
de sorte qu'il permet d'optimiser l'utilisation des expressions lambda.Maintenant, vous pouvez spécifier le champ de tri lors de l'appel de la
Sort
méthode.ref
et retour la liste triée (en changeant le nom de la méthode à partir deSort
àSorted
).Vous pouvez utiliser la Réflexion pour obtenir la valeur de la propriété.
Où TypeHelper possède une méthode statique comme:
Vous pouvez également regarder Dynamique LINQ de la VS2008 Échantillons de la bibliothèque. Vous pouvez utiliser l'interface IEnumerable extension de fonte de la Liste comme un IQueryable et ensuite utiliser le lien Dynamique OrderBy extension.
collection.ToList().OrderBy(x => TypeHelper.GetPropertyValue( x, sortBy)).ToList();
C'est comment j'ai résolu mon problème:
La construction de la commande par l'expression peut être lu ici
Sans vergogne volés de la page dans le lien:
Vous pouvez utiliser la réflexion pour accéder à la propriété.
Notes
la spécification de la propriété de trier par au lieu du nom de la propriété en tant que chaîne.
Tri utilise l'interface IComparable, si le type la met en œuvre.
Et vous pouvez éviter les ifs par la mise en œuvre d'une coutume IComparer:
et puis
Réponse pour 1.:
Vous devriez être en mesure de créer manuellement une arborescence d'expression qui peuvent être passés dans OrderBy en utilisant le nom d'une chaîne de caractères. Ou vous pouvez utiliser la réflexion, comme l'a suggéré dans une autre réponse, qui peut être moins de travail.
Modifier: Voici un exemple de travail de la construction d'une arborescence d'expression manuellement. (Le tri sur X. la Valeur, quand seulement en sachant le nom de "Valeur" de la propriété). Vous pouvez (devez) construire une méthode générique pour le faire.
La construction d'une arborescence d'expression nécessite de connaître la participante types, cependant. Qui pourrait ou ne pourrait pas être un problème dans votre scénario d'utilisation. Si vous ne savez pas quel type vous devriez être en tri, il va probablement être plus facile à l'aide de la réflexion.
Réponse pour les 2.:
Oui, depuis le Comparer<T>.La valeur par défaut sera utilisé pour la comparaison, si vous ne définissez pas explicitement les comparer.
Un autre, cette fois pour tout IQueryable:
Vous pouvez passer plusieurs critères de tri, comme ceci:
De la solution fournie par Rashack ne fonctionne pas pour les types de valeur (int, les énumérations, etc.) malheureusement.
Pour qu'il fonctionne avec tout type de bien, c'est la solution que j'ai trouvé: