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=“詹姆斯”
}
};
预期结果:
返回列表:
建立在国王的基础上回答:
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)}" );
}