Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据唯一性对列表进行分组_C#_Linq_List_Lambda - Fatal编程技术网

C# 根据唯一性对列表进行分组

C# 根据唯一性对列表进行分组,c#,linq,list,lambda,C#,Linq,List,Lambda,这是一个稍微修改过的问题 我有一个列表,其中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 =

这是一个稍微修改过的问题

我有一个列表,其中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};
var dto1=newdto{Name=“test”,Count=2};
var dto2=new DTO{Name=“test”,Count=3};
var dtoCollection=新列表{dto1,dto2};
现在,我的要求是需要从dtoCollection创建一个列表,其中Name字段在整个列表中应该是唯一的

例如,如果将上述dtoCollection从转换为所需列表,则生成的列表应如下所示:

列表计数应为1

列表中的对象应该是一个DTO,名称为“test”,计数为5

其中,Count是通过对名称字段相同的所有DTO中的Count字段求和获得的

尝试:

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=>new{dto.Name,dto.lasname})
然后从组中提取密钥的两个组件。但是,既然您确信姓氏对于名称是唯一的,那么您也可以使用我的原始代码提取组中第一个成员的姓氏:
[…],姓氏=组。first()。姓氏,[…]
。如果我的DTO有一个名为姓氏的额外字段,该怎么办?考虑到姓氏对于一个给定的名字是唯一的。我如何修改上面的查询。@Rockstart
GroupBy(d=>new{d.Name,d.lasname})
var newList = dtoCollection.GroupBy(d => d.Name)
             .Select(g => new DTO(){ Name=g.Key, Count=g.Select(d => d.Count).Sum()})
             .ToList();