2010-10-16 4 views
0

Supposons que j'aie deux classes, Client et Commande, où un client peut recevoir une ou plusieurs commandes.Comment réécrire cette boucle foreach en utilisant linq?

class Customer 
{ 
    Order[] Orders; 
} 

class Order 
{ 
    int OrderId; 
} 

Si pour un client donné, je veux trouver toutes les années ORDERID associés, est-il un moyen facile de le faire en utilisant LINQ? Quelque chose qui donne le même résultat que la solution suivante pour chaque solution:

List<int> allOrderIds = new List<int>(); 
foreach (Order thisOrder in thisCustomer) 
{ 
    allOrderIds.Add(thisOrder.OrderId); 
} 

TIA.

Répondre

8
var allOrderIds = thisCustomer.Orders.Select(o => o.OrderId).ToList(); 
+1

En fait oui, c'est la meilleure solution. +1 – RPM1984

+0

Fonctionne très bien, merci! – mikel

1

Vous pouvez utiliser une méthode d'extension que beaucoup de gens créent:

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
     action(item); 
    } 
} 

Et l'utiliser comme ceci:

thisCustomer.Orders.ForEach(c => allOrderIds.Add(o.OrderId)); 
+0

BTW - La solution @ mquander est meilleure, cependant je vous suggère de créer la méthode d'extension ci-dessus pour ajouter votre "LINQ Toolbelt". Cela va être utile. – RPM1984

+0

Voir aussi les commentaires de Lippert quant à savoir si c'est une bonne approche ou pas ... http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+0

Intéressant, mais je ne suis pas d'accord avec lui (dans ce cas). Oui - c'est moins lisible, je ne le ferais pas pour des opérations complexes (je l'utilise principalement pour les Assertions de test en boucle). Mais si vous trouvez cela illisible, vous trouverez probablement toutes les expressions lambda illisibles. Ce que je ne comprends pas, c'est pourquoi il est implémenté pour 'List ' et non 'IEnumerable '. – RPM1984

0

Utilisez la méthode de sélection. Vous devriez également garder les commandes sous forme de liste si vous voulez faire beaucoup d'instructions linq sur celles-ci.

thisCustomer.Orders.ToList().Select(o => o.OrderId).ToList(); 
+5

Le premier '.ToList()' est inutile. –

Questions connexes