2010-04-27 5 views
6

J'ai une requête Linq one-to-many et j'aimerais trier une propriété dans la collection "many". Par exemple dans le pseudo-code ci-dessous, je suis renvoyé une liste de la requête Linq mais je voudrais trier/commander la propriété Products basée sur la propriété SequenceNumber de la classe Product. Comment puis-je faire ceci? Toute information est appréciée. Merci.Trier la collection dans la collection à l'aide de Linq

public class Order 
{ 
    public int OrderId; 
    public List<Product> Products; 
} 

public class Product 
{ 
    public string name; 
    public int SequenceNumber; 
} 

Répondre

2

Dans Order, il suffit de faire

Products = Products.OrderBy(o => o.SequenceNumber); 

Il y a aussi une méthode Sort() au sein de List<T> pour trier la liste directement.

+0

« pseudo-code ci-dessous » – Andrey

+0

désolé, je mis à jour le pseudo-code dans mon message d'origine pour inclure les accesseurs (tout est public) – HBCondo

4
order.Product.OrderBy(p => p.SequenceNumber); 
4

Comme je l'ai lu votre question, votre requête renvoie IEnumerable <ordre> et que vous souhaitez les trier sur SequenceNumber.

Afin de trier quelque chose, il doit avoir une valeur. Il y a plusieurs SequenceNumber parce qu'il y a plusieurs produits. Vous devez décider comment vous allez sélectionner le numéro à trier. Supposons que vous vouliez trier les ordres sur le plus grand numéro de séquence pour les produits de cet ordre. Ensuite, une requête pourrait être:

from order in orders 
orderby order.Products.Max(p=>p.SequenceNumber) 
select order; 
+0

j'aime cette approche b/c il permet au tri dans le linq qu elle-même. cependant, je reçois un membre 'Int32 SequenceNumber' d'accès non légal erreur en essayant de le faire. – HBCondo

2

Si vous voulez trier la collection « en place », il suffit d'appeler

Products.Sort((lhs, rhs) => lhs.SequenceNumber.CompareTo(rhs.SequenceNumber)); 

Si vous voulez trier la collection « à la demande », il suffit d'utiliser LINQ:

foreach (var product in order.Products.OrderBy(x => x.SequenceNumber)) { 
} 
Questions connexes