我试图做一些非常简单的事情,但由于某种原因,我无法有效地完成它并且看起来像我期望的那样好。
我有一个人员集合,我需要用逗号分隔具有相同电子邮件地址的人员的姓名。
我尝试使用Aggregate
函数,但它为所有电子邮件返回一个字符串。我可以在 foreach 循环中完成它,但这似乎不是最好的方法。
有人可以建议我实现这个的好方法是什么吗?
这是数据:
var persons = new List<Person>
{
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "Mori"
},
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "Tori"
},
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "Jake"
},
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "Jove"
},
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "John"
},
new Person
{
Email = "[email protected] /cdn-cgi/l/email-protection",
Name = "James"
}
};
预期结果:
退货清单:
- 电子邮件(财产):[电子邮件受保护] /cdn-cgi/l/email-protection姓名(属性):Mori、Tori、Jake、Jove。
- 电子邮件(财产):[电子邮件受保护] /cdn-cgi/l/email-protection姓名(财产):约翰,詹姆斯。
以国王国王的答案为基础:
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
尽管我不建议为此使用 Person 类。我宁愿为该投影创建一个单独的视图模型。这是因为 person 类描述了该上下文中的单个人。使用它来存储某种人员集合会导致以后出现问题。
Output:
在某些时候你会想知道是否Person
现在存储一个名称或多个名称,您将引入某种 if 检查if(p.Name.indexOf(", ") != -1)
去处理它,你就会不断积累债务。只需创建一个 EmailPersonCollectionVm.cs
public class EmailPersonCollectionVm
{
public string Email { get; set;}
public List<string> Names {get; set;}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)