【问题标题】:Group a List based on uniqueness根据唯一性对列表进行分组
【发布时间】:2012-11-14 12:57:24
【问题描述】:

本题是Convert List<T> to Dictionary with strategy的略微修改版

我有 List,其中 DTO 类看起来像这样,

private class DTO
    {
        public string Name { get; set; }
        public int Count { get; set; }
    }

我创建对象并将其添加到列表中。

var dto1 = new DTO { Name = "test", Count = 2 };
var dto2 = new DTO { Name = "test", Count = 3 };
var dtoCollection = new List<DTO> {dto1, dto2};

现在我的要求是我需要从 dtoCollection 创建一个 List,其中 Name 字段在整个 List 中应该是唯一的。

例如,如果您将上述 dtoCollection 转换为所需的 List from,则结果列表应如下所示:

列表计数应为1;

列表中的对象应该是单个 DTO,Name 为“test”,Count 为 5

其中 Count 是通过对 Name 字段相同的所有 DTO 中的 Count 字段求和得到的

【问题讨论】:

    标签: c# linq list lambda


    【解决方案1】:

    试试:

    var result = dtoCollection.GroupBy(dto => dto.Name)
                              .Select(group => new DTO 
                                               {
                                                   Name = group.Key,
                                                   Count = group.Sum(dto => dto.Count) 
                                               })
                              .ToList();
    

    这通过按名称对 DTO 进行分组,然后从每个组中提取一个新的 DTO,该 DTO 由组的键和计数设置为其成员计数的总和。

    【讨论】:

    • 如果我的 DTO 有一个名为姓氏的额外字段怎么办?考虑姓氏对于给定名称是唯一的。如何修改上述查询。
    • 干净的方法是将其提取到密钥中以及GroupBy(dto =&gt; new { dto.Name, dto.Surname }),然后从组中提取密钥的两个组件。但是由于您确信姓氏对于一个名称是唯一的,您也可以使用我的原始代码提取组中第一个成员的姓氏:[...] , Surname = group.First().Surname, [...]
    【解决方案2】:
    var newList = dtoCollection.GroupBy(d => d.Name)
                 .Select(g => new DTO(){ Name=g.Key, Count=g.Select(d => d.Count).Sum()})
                 .ToList();
    

    【讨论】:

    • 如果我的 DTO 有一个名为姓氏的额外字段怎么办?考虑姓氏对于给定名称是唯一的。如何修改上述查询。
    • @Rockstart GroupBy(d =&gt; new {d.Name,d.SurName})
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2016-09-28
    • 2022-01-23
    相关资源
    最近更新 更多