2009-09-09 7 views
8

Ouf où je commence ... OK, j'ai une liste que je dois «découper» en liste plus petite en fonction de deux propriétés. Quand j'ai fini de travailler avec la petite liste, je veux que les éléments soient retirés de la liste originale :)C# Liste <> Trier par/Regrouper par/Enlever

f.ex. J'ai une liste <> CustomerProducts, qui contient deux valeurs CustomerID et ProductID. Je commence par la commande de la liste:

var orderedList = CustomerProducts.OrderBy(c => c.CustomerID).ThenBy(c => c.ProductID)ToList();

On suppose la liste ordereded ressemble maintenant à ceci:

CustomerID = 1, ProductID = 61
CustomerID = 1, ProductID = 61
CustomerID = 1, ProductID = 87
CustomerID = 2, ProductID = 81
CustomerID = 2, ProductID = 53

Maintenant, je veux une nouvelle liste qui ne contient que les deux premiers éléments de la liste (parce qu'ils ont la même CustomerID et ProductID), et supprimer ces deux éléments de la orderedList, puis continuez à faire la même chose pour le reste ... tandis que la orderedList n'est pas vide.

somehting comme ...

while (orderedList.Count> 0) {

// Créer une nouvelle liste qui a les mêmes valeurs ...
// font un travail sur la nouvelle liste
// supprimer la nouvelle liste de la orderedList
// continuer ...
}

Toutes les idées d'une solution intelligente pour cela? sens intelligent code court et joli :) ofcourse

+1

Juste pour vous assurer d'obtenir une réponse qui permet de résoudre votre porblem - avez-vous vraiment besoin de maintenir la liste que les petits progressivement commandé (qui est potentiellement au moins un peu cher), ou avez-vous juste besoin de traiter les articles dans des groupes de customerid/productid correspondants dans l'ordre? La première nécessite de construire constamment de nouvelles listes (ou de supprimer dès le début, toutes deux des opérations relativement coûteuses), tandis que la seconde peut utiliser une opération de regroupement plutôt simple. –

+0

Je suis d'accord avec le commentaire de Jonathan. Il semble que vous ayez une idée dans la tête de la façon de résoudre le problème, mais que vous ayez du mal à y arriver. Au lieu de nous parler du marteau que vous essayez d'utiliser, parlez-nous de la maison que vous construisez; le marteau pourrait être le mauvais outil pour la plomberie. Pouvez-vous caractériser le problème par les opérations métier que vous effectuez, et non par les détails d'implémentation de votre solution proposée par liste modifiable? –

Répondre

15
var groupedList = orderedList 
    .GroupBy(c => new {c.CustomerId, c.ProductId}) 
    .OrderBy(g => g.Key.CustomerId) 
    .ThenBy(g => g.Key.ProductId) 
    .ToList(); 

foreach(var group in groupedList) 
{ 
    List<CustomerProduct> cps = group.ToList(); 
    //do some work with this customer products 

    //no need to do inefficient list removal - just move on to next group. 
} 
+0

cela fonctionne parfaitement! merci –