在C# LINQ分组时更新同一对象DocCount属性的极简方案
无需新建类的Contact列表分组合并实现
现有类定义
public class Contact { public int Id { get; set; } public string Email { get; set; } public string DisplayName { get; set; } public int DocCount { get; set; } public string DocName { get; set; } }
原始数据列表
var contactList = new List<Contact>() { new Contact(){ Id = 1, Email = "abc@abc.com", DisplayName = "ABC", DocCount = 0, DocName = "testdoc1"}, new Contact(){ Id = 1, Email = "abc@abc.com", DisplayName = "ABC", DocCount = 0, DocName = "testdoc2"}, new Contact(){ Id = 1, Email = "abc@abc.com", DisplayName = "ABC", DocCount = 0, DocName = "testdoc3"}, new Contact(){ Id = 2, Email = "xyz@abc.com", DisplayName = "XYZ", DocCount = 0, DocName = "testdoc1"}, new Contact(){ Id = 2, Email = "xyz@abc.com", DisplayName = "XYZ", DocCount = 0, DocName = "testdoc2"}, new Contact(){ Id = 2, Email = "xyz@abc.com", DisplayName = "XYZ", DocCount = 0, DocName = "testdoc3"}, new Contact(){ Id = 3, Email = "mop@abc.com", DisplayName = "MOP", DocCount = 0, DocName = "testdoc1"}, new Contact(){ Id = 3, Email = "mop@abc.com", DisplayName = "MOP", DocCount = 0, DocName = "testdoc2"}, };
极简实现(无需新建类)
直接用LINQ分组后构造目标Contact对象:
var mergedContacts = contactList .GroupBy(c => new { c.Id, c.Email, c.DisplayName }) .Select(g => new Contact { Id = g.Key.Id, Email = g.Key.Email, DisplayName = g.Key.DisplayName, DocCount = g.Count(), DocName = string.Join(" ", g.Select(c => c.DocName)) }) .ToList();
实现说明
- 用匿名类型作为
GroupBy的分组键,确保Id、Email、DisplayName完全匹配的项被归为同一组 - 在
Select中直接实例化Contact,将组内文档总数赋值给DocCount,用string.Join拼接所有文档名称到DocName - 最终得到的
mergedContacts完全符合需求的输出结构
内容的提问来源于stack exchange,提问作者Vijayashankar Aruchamy
相关产品推荐
相关产品推荐

