2010-09-09 4 views
4

J'essaie de trier une liste de commandes et d'articles en fonction de la première date de création (la plus basse) de l'un des articles de la liste.Tri des listes avec des sous-éléments en C#

J'ai donc:

public MyOrder 
{ 
orderid int; 
IList<MyItems> orderitems; 
} 

public MyItems 
{ 
DateTime itemcreatedate; 
} 

Say Order1 a deux articles dans avec itemcreatedate 6/1/2010 et 6/15/2010

ORDER2 a deux articles dans avec itemcreatedate 4/1/2010 et 6/10/2010

Je voudrais ma liste triée pour être ensuite ORDER2, Order1

mon maigre cerveau des développeurs de l'homme des cavernes dégelé peut voir une manière itérative de la force brute pour y arriver, mais je me demande si quelqu'un a une belle façon propre.

+0

Ces champs sont-ils publics? Si non, comment sont-ils accédés? –

+0

Ouais ils sont publics ... Je l'ai exclu pour la brièveté. – Webjedi

Répondre

6

Essayez quelque chose comme ceci:

List<MyOrder> sortedList = myOrders 
    .OrderBy(myOrder => myOrder.OrderItems.Min(myItem => myItem.ItemCreateDate)) 
    .ToList(); 
+0

Slick ... merci beaucoup. – Webjedi

0

Voici mon code (non testé!):

List<MyOrder> orders = GetSomeOrders(); 
var orderCreateDateMap = orders.ToLookup(order => order.orderitems.Min(o2 => o2.itemcreatedate)); 
var sortedGroups = orderCreateDateMap.OrderBy(g => g.Key); 
var sortedOrders = sortedGroups.SelectMany(g => g); 

Le concept est un peu semblable à Marc, mais j'utiliser la recherche pour éviter IEnumerable<>.Min méthode être appelé plusieurs fois.