Trier une liste & lt; T & gt; en utilisant des expressions de requête
J'ai un problème à l'aide de Linq pour commander une structure comme ceci :
public class Person
{
public int ID { get; set; }
public List<PersonAttribute> Attributes { get; set; }
}
public class PersonAttribute
{
public int ID { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
Une personne peut aller comme ceci:
PersonAttribute Age = new PersonAttribute { ID = 8, Name = "Age", Value = "32" };
PersonAttribute FirstName = new PersonAttribute { ID = 9, Name = "FirstName", Value = "Rebecca" };
PersonAttribute LastName = new PersonAttribute { ID = 10, Name = "LastName", Value = "Johnson" };
PersonAttribute Gender = new PersonAttribute { ID = 11, Name = "Gender", Value = "Female" };
Je voudrais utiliser LINQ projection de tri d'une liste de personnes de l'ascendant en la personne de l'attribut de mon choix, par exemple, un tri sur l'Âge, ou tri sur Prénom.
Je suis en train d'essayer quelque chose comme
string mySortAttribute = "Age"
PersonList.OrderBy(p => p.PersonAttribute.Find(s => s.Name == mySortAttribute).Value);
Mais la syntaxe est de ne pas en moi. Toute indices?
source d'informationauteur | 2009-03-30
Vous devez vous connecter pour publier un commentaire.
OrderBy
est une extension LINQ qui produit une nouvelle séquence. À l'ordre de la séquence existante, vous devez ajouter une méthode d'extension ou deux... ensuite, vous pouvez utiliser:Je sais que c'est un vieux post, mais je pensais que je poste un comparateur, j'ai trouvé il y a un moment dans le cas où quelqu'un d'autre en a besoin.
Utilisation
Vous peut surcharger le constructeur d'accepter la SortDirection enum. Je n'avais pas le faire parce que la classe est dans une bibliothèque sans une référence à System.Web.
Pourquoi n'utilisez-vous pas une valeur-clé de dictionnaire au lieu de votre Liste<PersonAttribute> ? Il conviendrait le mieux, je pense, et faire tout le reste plus facile.
Mise à jour comme ceci:
C'est en supposant que l'Attribut de classe en œuvre IComparable ou a une belle fonction ToString (je l'espère).
Sinon, la syntaxe devient plus compliquée:
J'ai aussi supposer que vous avez une seule valeur pour chaque clé - sinon, vous auriez besoin d'avoir plus intelligente de code... 😉
Pourrait-il que votre syntaxe est mauvaise? Votre propriété est appelée Attributs, mais votre utilisation de quelque chose qui s'appelle ObjectSettings dans le code? Ou est-ce une faute de frappe.
Si c'est ton code a l'air bien moins que pas toutes les Personne instances de l'Attribut que vous essayez de faire une commande dans ce cas, vous obtiendrez une exception.
EDIT:
Aussi, au lieu d'utiliser le Trouver, essayez d'utiliser en Premier.
J'imagine que vous avez une exception dans le cas où un article n'est pas un attribut d'âge.
J'ai essayé le code ci-dessous, et il a bien fonctionné - je suppose que vos données sont un peu hors, comme souligné par d'autres affiches. De toute façon, le ci-dessous fonctionne très bien...
Certains cas, vous devez tenir compte:
Si vous créez cette extension des méthodes de classe:
Vous pouvez ensuite trier la liste correctement de cette manière:
Cela donnera à corriger ordre de tri.
Si l'attribut est toujours présent, vous pouvez supprimer
defaultAttribute
.De tri, 'Nom' suffit d'utiliser: