2012-02-08 36 views
7

我已经写了需要项目集合(价格的项目 - 每个项目都有一个量和代码)的方法,并通过代码然后返回一个IDictionary组在哪儿,关键是代码该项目和值是该集团与代码项目组的集合,并返回一个字典

这里的方法的实现(这是有道理的希望!):

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; 
} 

我又试图重构这个使用ToDictionary像这样:

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

我得到一个错误,当我尝试编译它说我不能从string, IGrouping<string, PriceDetail>字典转换成string, IEnumerable<PriceDetail>字典。

谁能告诉我如何正确地重构我在这个方法的第一次尝试?我觉得有一个更简洁的方式写它,但无法弄清楚!

回答

12

如何:

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

我想收集返回的代码键,并且每个键的值应该是PriceDetails用于收集该代码 - 所以>。我可以用你的方法吗? – 2012-02-08 16:02:01

+1

如果您只是为了搜索代码并获取集合而转换成字典,而无意进一步修改字典,那么ILookup就是一个更好的匹配。 – Wilhelm 2012-02-08 16:21:35

+0

在我从这个方法返回后过程的下一个是通过收集迭代(所以,每个组),总结的详细价格该组的收集量。我在这里错过了什么吗?我可以用ILookup来做吗?或者,现在我正在写这篇文章,我想我应该返回一些代码作为关键字,然后是一个总和的数额,并用一种​​方法完成所有工作......非常感谢您的任何建议! – 2012-02-08 16:30:31

11

你能不能做:

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

我觉得这是答案 – 2018-02-20 23:25:36