2012-02-08 14 views
7

He escrito un método que toma una colección de artículos (artículos de precio - cada artículo tiene una cantidad y un código) y los agrupa por código y luego devuelve un IDictionary donde la clave es el código del artículo y el valor es el grupo de artículos con ese códigoAgrupar una colección y devolver un Dictionary

Aquí está la implementación del método (la esperanza que tiene sentido!):

public IDictionary<string, IEnumerable<PriceDetail>> GetGroupedPriceDetails(IEnumerable<PriceDetail> priceDetails) 
{ 
    // create a dictionary to return 
    var groupedPriceDetails = new Dictionary<string, IEnumerable<PriceDetail>>(); 

    // group the price details by code 
    var grouping = priceDetails.GroupBy(priceDetail => priceDetail.Code); 

    // foreach grouping, add the code as key and collection as value to the dictionary 
    foreach (var group in grouping) 
    { 
     groupedPriceDetails.Add(group.Key, group); 
    } 

    // return the collection 
    return groupedPriceDetails; 
} 

luego trató de refactorizar esto para usar ToDictionary como tal :

// group the price details by code and return 
return priceDetails.GroupBy(priceDetail => priceDetail.Code) 
        .ToDictionary(group => group.Key, group => group); 

Aparece un error cuando intento compilar lo que dice que no puedo convertir un diccionario de string, IGrouping<string, PriceDetail> en un diccionario de string, IEnumerable<PriceDetail>.

¿Alguien me puede decir cómo refactorizar correctamente mi primer intento de este método? ¡Siento que hay una manera más concisa de escribirlo pero no puedo resolverlo!

Respuesta

12

¿Qué tal:

public ILookup<string, PriceDetail> GetGroupedPriceDetails(IEnumerable<PriceDetail> priceDetails) 
{ 
    return priceDetails.ToLookup(priceDetail => priceDetail.Code); 
} 
+0

que quiero la colección volvieron a ser introducido por el código, y el valor para cada clave debe ser la colección de PriceDetails para ese código - entonces >. ¿Puedo hacer eso con tu método? –

+1

Si se está transformando en un diccionario solo por la capacidad de buscar un código y obtener una colección, sin la intención de modificar aún más el diccionario, ILookup es una mejor coincidencia. – Wilhelm

+0

El siguiente en el proceso después de haber regresado de este método es iterar a través de la colección (por lo tanto, para cada grupo) y sumar el monto de la recopilación de detalles del precio para ese grupo. ¿Me estoy perdiendo de algo? ¿Puedo hacer eso usando ILookup en su lugar? O bien, ahora que estoy escribiendo esto, creo que debería devolver algo que tenga el código como clave y luego una cantidad que sea la suma y hacerlo todo en un solo método ... ¡cualquier sugerencia muy apreciada! –

11

¿Puede usted no hacer:

priceDetails.GroupBy(priceDetail => priceDetail.Code) 
       .ToDictionary(group => group.Key, group => group.ToList()) 
+2

siento que esta es la respuesta –

Cuestiones relacionadas