如何按键分组列表并转换结果

时间:2019-01-30 23:26:03

标签: c# linq

我有以下列表,我需要对其进行转换以获得此结果 原始列表

+----+--------------------+
| 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完成此任务?谢谢

2 个答案:

答案 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>();

您可以GroupByKey值,然后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))