我在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表达式中执行此操作?
答案 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());