2009-09-09 15 views
8

Dove inizio ... OK, ho una lista che devo tagliare in una lista più piccola in base a due proprietà. Quando ho finito di lavorare con la lista piccola voglio che gli oggetti siano rimossi dall'elenco originale :)C# Elenco <> Ordina per/Raggruppa per/Rimuovi

f.ex. Ho un elenco <> CustomerProducts, che contiene due valori CustomerID e ProductID. Comincio ordinando l'elenco:

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

Assumere il lista ordereded appare come segue:

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

Ora voglio una nuova lista che contiene solo i primi due elementi nell'elenco (perché hanno lo stesso CustomerID e ProductID), e rimuovere questi due elementi dal orderedlist, e poi continua a fare lo stesso con il resto ... mentre l'OrderList non è vuota.

somehting come ...

while (orderedList.Count> 0) {

// creare nuova lista che ha gli stessi valori ...
// fare un certo lavoro sul nuovo elenco
// rimuovere il nuovo elenco dal orderedlist
// continua ...
}

Qualche idea di una soluzione intelligente per questo ?? significato intelligente codice breve e abbastanza naturalmente :)

+1

solo per assicurarsi che si ottiene una risposta che risolve il porblem - non si ha realmente bisogno per mantenere la lista che progressivamente più piccoli ordinata (che è potenzialmente almeno un po 'costoso), o hai solo bisogno di elaborare gli articoli in gruppi di matching customerid/productid in ordine? Il primo richiede costantemente la costruzione di nuovi elenchi (o la rimozione dall'inizio, entrambe le operazioni relativamente costose), mentre il secondo può utilizzare un'operazione di raggruppamento piuttosto diretto. –

+0

Sono d'accordo con il commento di Jonathan. Sembra che tu abbia un'idea nella tua testa su come risolvere il problema, ma hai problemi a farlo accadere. Invece di dirci del martello che stai cercando di usare, parlaci della casa che stai costruendo; il martello potrebbe essere lo strumento sbagliato per l'impianto idraulico. Puoi caratterizzare il problema dalle operazioni commerciali che stai eseguendo e non dai dettagli di implementazione della tua proposta di soluzione basata su elenco mutabile? –

risposta

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

funziona perfettamente! thanx –

Problemi correlati