【问题标题】:Add comma between all names in a list of object在对象列表中的所有名称之间添加逗号
【发布时间】:2018-04-18 06:34:23
【问题描述】:

我正在尝试做一些非常简单的事情,但由于某种原因,我无法有效地做到这一点并且看起来不错。

我有一个 Persons 集合,我需要用逗号分隔拥有相同电子邮件地址的人的姓名。

我尝试使用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"
    }
};

预期结果:

返回列表:

  1. 电子邮件(属性):A@gmail.com 名称(属性):Mori,Tori,Jake,Jove。
  2. 电子邮件(属性):B@gmail.com 名称(属性):John,James。

【问题讨论】:

  • 可以这么简单persons.GroupBy(e =&gt; e.Email).Select(g =&gt; $"{g.Key}. Name: {string.Join(",",g.Select(e =&gt; e.Name)}")
  • 根据电子邮件对列表进行排序。然后遍历列表以跟踪上一封电子邮件。如果当前电子邮件与上一个电子邮件匹配,则在名称列表中附加一个逗号,然后是当前名称。如果没有,您就完成了上一封电子邮件。
  • @KingKing:你为什么不发布与答案相同的内容?
  • @KingKing 我认为你没有正确理解我。你返回了一个字符串。我的意思是应该返回一个 List ,其中电子邮件保持不变并且名称用逗号聚合。
  • @un-lucky 我认为这很简单,如果有人有相同的答案并想添加它,请继续。

标签: c#


【解决方案1】:
var res=from data in persons 
                group data by data.Email into groupdata
                select new
        {
            Email=groupdata.Key,
            Name=string.Join(",",groupdata.Select((x=>x.Name)).ToList())
        };

【讨论】:

    【解决方案2】:

    以 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
    

    虽然我不建议为此使用 Person 类。我宁愿为该投影创建一个单独的视图模型。那是因为 person 类在那个上下文中描述了一个人。使用它来存储某种人员集合是解决问题的秘诀。

    输出:

    在某些时候,您会想知道 Person 现在是否存储一个名称或多个名称,并且您会引入某种 if 检查 if(p.Name.indexOf(", ") != -1) 来处理它,并且您会继续堆积这些债务。只需创建一个 EmailPersonCollectionVm.cs

    public class EmailPersonCollectionVm 
    {
        public string Email { get; set;}
        public List<string> Names {get; set;}
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

       var result = persons.GroupBy(c => c.Email).Select(c => new Person()
                  {
                      Email = c.First().Email,
                      Name = string.Join(", ", c.Select(b=>b.Name).ToList())
                  });
      

      【讨论】:

        【解决方案4】:

        你好,米莎·扎斯拉夫斯基,

        在这种情况下,您可以轻松地使用 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)}" );
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-26
          • 2020-09-25
          • 1970-01-01
          • 2022-07-04
          • 2017-12-24
          • 1970-01-01
          • 2017-08-30
          相关资源
          最近更新 更多