2009-09-09 42 views
8

Phew donde empiezo ... OK, tengo una lista que tengo que 'cortar' en una lista más pequeña, dependiendo de dos propiedades. Cuando termine de trabajar con la lista pequeña, quiero que se eliminen los elementos de la lista original :)C# List <> Ordenar por/Agrupar por/Eliminar

f.ex. Tengo una lista <> CustomerProducts, que contiene dos valores CustomerID y ProductID. Comienzo por ordenar la lista:

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

asumir la lista ordereded ahora se ve así:

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

Ahora quiero una nueva lista que contiene sólo los dos primeros elementos de la lista (porque tienen el mismo CustomerID y ProductID), de eliminar estos dos elementos de la orderedlist, y luego continúe haciendo lo mismo con el resto ... mientras que orderedList no está vacío.

somehting como ...

tiempo (orderedList.Count> 0) {

// crear nueva lista que tiene los mismos valores ...
// hacer algún trabajo en el nueva lista
// eliminar la nueva lista de la orderedlist
// continuar ...
}

¿Alguna idea de una solución inteligente para esto? significado inteligente código corto y bonito por supuesto :)

+1

sólo para asegurarse de que obtenga una respuesta que resuelve su porblem - lo que realmente necesita para mantener la lista que progresivamente menor ordenada (que es potencialmente al menos un poco caro), ¿o solo necesita procesar los artículos en grupos de matching customerid/productid en orden? El primero requiere construir constantemente nuevas listas (o eliminar desde el principio, ambas operaciones relativamente costosas), mientras que el segundo puede usar una operación de agrupación bastante directa. –

+0

Estoy de acuerdo con el comentario de Jonathan. Parece que tienes una idea en tu cabeza de cómo resolver el problema, pero estás teniendo problemas para hacerlo realidad. En lugar de decirnos sobre el martillo que está tratando de usar, cuéntenos sobre la casa que está construyendo; el martillo podría ser la herramienta incorrecta para la tubería. ¿Puede caracterizar el problema por las operaciones comerciales que está realizando y no por los detalles de implementación de su solución propuesta basada en listas mutables? –

Respuesta

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

¡esto funciona perfectamente! gracias –