我正在尝试做一些非常简单的事情,但出于某种原因,我不能有效地做到并且看起来很好,就像我期望的那样.
我有一组人员,我需要用逗号分隔名字给那些拥有相同电子邮件的人.
我尝试使用Aggregate函数,但它为所有电子邮件返回一个字符串.我可以在foreach循环中完成它,但它似乎不是最好的方法.
有人可以告诉我实现这个的好方法吗?
这是数据:
var persons = new List<Person>
{
new Person
{
Email = "A@gmail.com",
Name = "Mori"
},
new Person
{
Email = "A@gmail.com",
Name = "Tori"
},
new Person
{
Email = "A@gmail.com",
Name = "Jake"
},
new Person
{
Email = "A@gmail.com",
Name = "Jove"
},
new Person
{
Email = "B@gmail.com",
Name = "John"
},
new Person
{
Email = "B@gmail.com",
Name = "James"
}
};
Run Code Online (Sandbox Code Playgroud)
预期结果:
退货清单:
以King Kings为基础回答:
var groupedByEmails = persons.GroupBy (p => p.Email)
.Select (p => new Person {
Email = p.Key,
Name = String.Join(", ", p.Select (x => x.Name))
}).ToList();
groupedByEmails.Dump(); //only in LinqPad
Run Code Online (Sandbox Code Playgroud)
虽然我不建议使用Person类.我宁愿为该投影创建一个单独的视图模型.这是因为人类在这种情况下描述了一个人.使用它来存储某种人物收集是一种解决问题的方法.
输出:
在某些时候,你会想知道Person现在是否存储了一个名称或多个名称,你会介绍一些如果检查if(p.Name.indexOf(", ") != -1)来处理它,你继续堆积债务.只需创建一个EmailPersonCollectionVm.cs
public class EmailPersonCollectionVm
{
public string Email { get; set;}
public List<string> Names {get; set;}
}
Run Code Online (Sandbox Code Playgroud)