【问题标题】:Group a collection and return a Dictionary对集合进行分组并返回字典
【发布时间】:2012-02-08 15:56:37
【问题描述】:

我编写了一个方法,它采用一组项目(价格项目 - 每个项目都有一个数量和一个代码)并按代码对它们进行分组,然后返回一个 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&lt;string, PriceDetail&gt; 的字典转换为 string, IEnumerable&lt;PriceDetail&gt; 的字典。

有人可以告诉我如何正确重构我对这种方法的第一次尝试吗?感觉有更简洁的写法但是想不通!

【问题讨论】:

    标签: c# .net linq refactoring


    【解决方案1】:

    你可以不做吗:

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

    【讨论】:

    • 我觉得这就是答案
    • 这就是我一直在寻找的
    【解决方案2】:

    怎么样:

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

    【讨论】:

    • 我希望返回的集合以代码为键,每个键的值应该是该代码的 PriceDetails 集合 - 所以 >。我可以用你的方法吗?
    • 如果你转成字典只是为了能够搜索代码和获取集合,而不打算进一步修改字典,ILookup是一个更好的匹配。
    • 从这个方法返回后的下一个过程是遍历集合(因此,对于每个组)并对该组的价格详细信息集合的数量求和。我在这里错过了什么吗?我可以使用 ILookup 来代替吗?或者,现在我正在写这篇文章,我想我应该返回一些以代码为键的东西,然后是一个总和的数量,并以一种方法完成所有这些......非常感谢任何建议!跨度>
    • 好酷 - 我不知道 ILookup 在做什么,所以我阅读并发现它扩展了 IGrouping 等。刚刚实施了更改并运行了测试以查看返回的内容,这正是我所做的通缉。谢谢!
    猜你喜欢
    • 2022-07-07
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多