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

C# 在对象列表中的所有名称之间添加逗号,c#,C#,我正在尝试做一些非常简单的事情,但由于某些原因,我不能有效地做,也不能像我期望的那样看起来很好 我有一个收集的人,我需要分开的名字与逗号为那些谁有相同的电子邮件 我尝试使用Aggregate函数,但它为所有电子邮件返回一个字符串。我可以在foreach循环中完成,但这似乎不是最好的方法 有人能告诉我实施这个的好方法吗 以下是数据: var persons = new List<Person> { new Person { Email = "A@gmai

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

我有一个收集的人,我需要分开的名字与逗号为那些谁有相同的电子邮件

我尝试使用
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"
    }
};
var persons=新列表
{
新人
{
电子邮件=”A@gmail.com",
Name=“莫里”
},
新人
{
电子邮件=”A@gmail.com",
Name=“Tori”
},
新人
{
电子邮件=”A@gmail.com",
Name=“杰克”
},
新人
{
电子邮件=”A@gmail.com",
Name=“Jove”
},
新人
{
电子邮件=”B@gmail.com",
Name=“约翰”
},
新人
{
电子邮件=”B@gmail.com",
Name=“詹姆斯”
}
};
预期结果:

返回列表:

  • 电邮(物业):A@gmail.com姓名(财产):森、托里、杰克、朱庇特
  • 电邮(物业):B@gmail.com姓名(财产):约翰,詹姆斯

  • 建立在国王的基础上回答:

    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类。我宁愿为该投影创建一个单独的viewmodel。这是因为person类在该上下文中描述了一个人。使用它来存储某种类型的个人收藏是今后出现问题的秘诀

    输出:

    在某个时刻,你会想知道这个
    人现在是存储一个名字还是多个名字,你会引入某种if检查
    if(p.name.indexOf(“,”)=-1)
    来处理这个问题,你会不断积累债务。只需创建一个EmailPersonCollectionVm.cs

    public class EmailPersonCollectionVm 
    {
        public string Email { get; set;}
        public List<string> Names {get; set;}
    }
    
    公共类EmailPersonCollectionVm
    {
    公共字符串电子邮件{get;set;}
    公共列表名称{get;set;}
    }
    
    您可以尝试以下方法:

     var result = persons.GroupBy(c => c.Email).Select(c => new Person()
                {
                    Email = c.First().Email,
                    Name = string.Join(", ", c.Select(b=>b.Name).ToList())
                });
    
    你好,米莎·扎斯拉夫斯基

    在这种情况下,您可以轻松使用LINQ查询并格式化输出:

    var maillist = from p in persons
                   group p by p.Email into grp
                   select new { grp.Key, Names=grp.Select(g => g.Name).ToArray() };
    
    foreach( var entry in maillist) {
        Console.WriteLine($"EMail: {entry.Key} Names: {string.Join<string>(",", entry.Names)}" );
    }
    
    var maillist=来自p个人
    通过电子邮件将p分组到grp中
    选择new{grp.Key,Names=grp.select(g=>g.Name).ToArray()};
    foreach(邮件列表中的var条目){
    Console.WriteLine($”电子邮件:{entry.Key}名称:{string.Join(“,”,entry.Names)}”);
    }
    
    persons.GroupBy(e=>e.Email)可以这样简单。选择(g=>$“{g.Key}。名称:{string.Join(“,”,g.Select(e=>e.Name)}”)
    根据电子邮件对列表进行排序。然后遍历列表,跟踪上一封电子邮件。如果当前电子邮件与上一封电子邮件匹配,则在名称列表中添加逗号,然后是当前名称。如果不匹配,则上一封邮件已处理完毕。@KingKing:为什么不发布与答案相同的内容?@KingKing我想你不明白我的意思e正确。您返回了一个“全部”字符串。我的意思是,应该返回一个列表,其中电子邮件保持不变,名称用逗号聚合。@un lucky我认为这相当简单,如果有人有相同的答案并希望添加,请继续。
    var maillist = from p in persons
                   group p by p.Email into grp
                   select new { grp.Key, Names=grp.Select(g => g.Name).ToArray() };
    
    foreach( var entry in maillist) {
        Console.WriteLine($"EMail: {entry.Key} Names: {string.Join<string>(",", entry.Names)}" );
    }