搜索重复项并用它们填充列表

时间:2020-06-17 10:00:09

标签: c# list linq duplicates

我在Linqpad中编写了一些代码来查找重复项,并且工作正常,但是我只有一个重复项列表List。现在,我想获得一个IEnumerable>,将每个重复项与另一个linq代码分成不同的列表。

void Main()
{
    var list = new List<Info> {
            new Info { Id = 1, Name = "Fabrice", Age = 52},
            new Info { Id = 2, Name = "Eric", Age = 52},
            new Info { Id = 3, Name = "Hervé", Age = 52},
            new Info { Id = 4, Name = "Hugo", Age = 16 },
            new Info { Id = 5, Name = "Léo", Age = 16 },
            new Info { Id = 6, Name = "Noé", Age = 13 },
            new Info { Id = 7, Name = "Estéban", Age = 13 },
            new Info { Id = 8, Name = "Fabrice", Age = 52},
            new Info { Id = 9, Name = "Hugo", Age = 16 },
            new Info { Id = 10, Name = "Noé", Age = 13 },
            new Info { Id = 11, Name = "Fabrice", Age = 52},
        };

    List<Info> lstDuplicates = list.GroupBy(x => new { x.Name, x.Age })
        .Where(g => g.Count() > 1)
        .SelectMany(g => g)
        .ToList();

    foreach (var duplicate in lstDuplicates)
    {
        Console.WriteLine("Duplicate -> {0}", duplicate.ToString());
    }
}

public class Info
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return string.Format("Id : {0}, Name : {1}, Age : {2}", Id, Name, Age);
    }
}

这段代码给出了:

Duplicate -> Id : 1, Name : Fabrice, Age : 52
Duplicate -> Id : 8, Name : Fabrice, Age : 52
Duplicate -> Id : 11, Name : Fabrice, Age : 52
Duplicate -> Id : 4, Name : Hugo, Age : 16
Duplicate -> Id : 9, Name : Hugo, Age : 16
Duplicate -> Id : 6, Name : Noé, Age : 13
Duplicate -> Id : 10, Name : Noé, Age : 13

但是现在,我想将重复项分开:

// A result in an IEnumerable<List<Info>> with 3 items
// First item
Duplicate -> Id : 1, Nom : Fabrice, Age : 52
Duplicate -> Id : 8, Nom : Fabrice, Age : 52
Duplicate -> Id : 11, Nom : Fabrice, Age : 52

// Second item
Duplicate -> Id : 4, Nom : Hugo, Age : 16
Duplicate -> Id : 9, Nom : Hugo, Age : 16

// Third item
Duplicate -> Id : 6, Nom : Noé, Age : 13
Duplicate -> Id : 10, Nom : Noé, Age : 13

如何在原始列表的单个LINQ表达式中执行此操作?

2 个答案:

答案 0 :(得分:2)

要获得IEnumerable<List<Info>>的每个组的重复项列表,您应该使用Select(g => g.ToList())而不是SelectMany(这将返回平坦的重复项列表)

var lstDuplicates = list.GroupBy(x => new { x.Name, x.Age })
    .Where(g => g.Count() > 1)
    .Select(g => g.ToList());

在您的情况下,您只需要将每个组转换为列表即可

答案 1 :(得分:1)

使用select many的select实例并将g更改为g.toList()


var list = new List<Info> {
            new Info { Id = 1, Name = "Fabrice", Age = 52},
            new Info { Id = 2, Name = "Eric", Age = 52},
            new Info { Id = 3, Name = "Hervé", Age = 52},
            new Info { Id = 4, Name = "Hugo", Age = 16 },
            new Info { Id = 5, Name = "Léo", Age = 16 },
            new Info { Id = 6, Name = "Noé", Age = 13 },
            new Info { Id = 7, Name = "Estéban", Age = 13 },
            new Info { Id = 8, Name = "Fabrice", Age = 52},
            new Info { Id = 9, Name = "Hugo", Age = 16 },
            new Info { Id = 10, Name = "Noé", Age = 13 },
            new Info { Id = 11, Name = "Fabrice", Age = 52},
        };

        IEnumerable<List<Info>> lstDuplicates = list.GroupBy(x => new { x.Name, x.Age })
            .Where(g => g.Count() > 1)
            .Select(g => g.ToList());