在linq C#中分组时更新同一对象中的count属性

pkwftd7m  于 2023-01-18  发布在  C#
关注(0)|答案(2)|浏览(147)

班级:

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(){1,"abc@abc.com","ABC",0,"testdoc1"},
                           new Contact(){1,"abc@abc.com","ABC",0,"testdoc2"},
                           new Contact(){1,"abc@abc.com","ABC",0,"testdoc3"},
                           new Contact(){2,"xyz@abc.com","XYZ",0,"testdoc1"},
                           new Contact(){2,"xyz@abc.com","XYZ",0,"testdoc2"},
                           new Contact(){2,"xyz@abc.com","XYZ",0,"testdoc3"},
                           new Contact(){3,"mop@abc.com","MOP",0,"testdoc1"},
                           new Contact(){3,"mop@abc.com","MOP",0,"testdoc2"},
}

我正在寻找的输出,我需要更新的文件计数的基础上,由用户上传的文件计数。

预期输出为:

{1,"abc@abc.com","ABC",3,"testdoc1 testdoc2 testdoc3"},
{2,"xyz@abc.com","XYZ",3,"testdoc1 testdoc2 testdoc3"},
{3,"mop@abc.com","MOP",2,"testdoc1 testdoc2"}

有什么方法可以做到这一点吗?我知道我们可以引入新类并实现它,但需要一些最小的东西

hmae6n7t

hmae6n7t1#

我认为通过LINQ更新示例不是一个好的实践--只需创建一个新的Contact示例:

var result = contactList
    .GroupBy(c => c.Id)
    .Select(gr => new Contact
    {
        Id = gr.Key,
        Email = gr.First().Email,
        DisplayName = gr.First().DisplayName,
        DocCount = gr.Count(),
        DocName = string.Join(", ", gr.Select(c => c.DocName))
    })
    .ToList();

或者,如果您预计电子邮件/显示名称会出现差异:

var result = contactList
    .GroupBy(c => (c.Id, c.Email, c.DisplayName))
    .Select(gr => new Contact
    {
        Id = gr.Key.Id,
        Email = gr.Key.Email,
        DisplayName = gr.Key.DisplayName,
        DocCount = gr.Count(),
        DocName = string.Join(", ", gr.Select(c => c.DocName))
    })
    .ToList();
ssm49v7z

ssm49v7z2#

您可以将GroupBy()Select()结合使用:

var newList = contactList
        .GroupBy(p => new { p.Id, p.Email, p.DisplayName} )
        .Select(p=> new Contact(p.Key.Id,
                                p.Key.Email,
                                p.Key.DisplayName,
                                p.Count(),
                                string.Join(" ",p.Select(o=>o.DocName))))
        .ToList();

相关问题