我有以下列表,我需要对其进行转换以获得此结果 原始列表
+----+--------------------+
| key| email |
+====+====================+
| 1 | one@gmail.com |
| 2 | two@gmail.com |
| 1 | three@gmail.com |
| 1 | four@gmail.com |
| 2 | five@gmail.com |
| 2 | six@gmail.com |
+----+----------------+-----
新列表与 ;
串联的邮件+----+---------------------------------------------------+
| key| email |
+====+===================================================+
| 1 | one@gmail.com;three@gmail.com;four@gmail.com |
| 2 | two@gmail.com;five@gmail.com;six@gmail.com |
+----+---------------------------------------------------+
我如何使用C#Linq完成此任务?谢谢
答案 0 :(得分:1)
以这种方式尝试:
x.GroupBy(t => new {t.Id})
.Select(t => new {
Id = t.Key.Id,
email = String.Join(", ", t.Select(p => p.Email).ToArray())
}
答案 1 :(得分:1)
假设您有一个与此相似的类:
public class myEmails
{
public int Key { get; set; }
public string Email { get; set; }
}
和一个List<myEmails>
可能是这样的:
List<myEmails> emails = new List<myEmails>();
您可以GroupBy的Key
值,然后Join与此Emails
相关的所有字符串(Key
),创建一个新的 {{ 1}} ,其中包含按给定Dictionary<int, string>
分组的所有电子邮件:
Key
使用以下方法测试结果:
var emailsDictionary = emails
.GroupBy(eml => eml.Key)
.ToDictionary(grp => grp.Key, grp => string.Join(" ", grp.Select(eml => eml.Email)));
它应该给您:
emailsDictionary.ToList().ForEach(dict => Console.WriteLine($"{dict.Key}: {dict.Value}"));
请注意,如果您有兴趣,也可以使用Aggregate代替1: one@gmail.com three@gmail.com four@gmail.com
2: two@gmail.com five@gmail.com six@gmail.com
,因此:
Join
也可以表示为:
grp => string.Join(" ", grp.Select(eml => eml.Email))