在对象列表中的所有名称之间添加逗号

Mis*_*sky 2 c#

我正在尝试做一些非常简单的事情,但出于某种原因,我不能有效地做到并且看起来很好,就像我期望的那样.

我有一组人员,我需要用逗号分隔名字给那些拥有相同电子邮件的人.

我尝试使用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)

预期结果:

退货清单:

  1. 电子邮件(财产):A@gmail.com姓名(财产):Mori,Tori,Jake,Jove.
  2. 电子邮件(财产):B@gmail.com姓名(财产):约翰,詹姆斯.

Mar*_*rco 5

以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)