C# select 从子组重复

C# select duplicates from sub-group

我想过滤掉“”名称,然后 select 每个存在重复 ID 的唯一位置,无论名称如何:

数据设置

var list = new[]
{
    new { id = 3, Name = "", Location = "LocationA" },
    new { id = 2, Name = "", Location = "LocationA" },
    new { id = 1, Name = "T", Location = "LocationB" },
    new { id = 2, Name = "H", Location = "LocationB" },
    new { id = 3, Name = "E", Location = "LocationB" },
    new { id = 3, Name = "R", Location = "LocationB" },
    new { id = 5, Name = "U", Location = "LocationC" },
    new { id = 5, Name = "S", Location = "LocationC" },
    new { id = 5, Name = "S", Location = "LocationD" },
    new { id = 4, Name = "O", Location = "LocationD" },
    new { id = 4, Name = "Z", Location = "LocationE" },
};

查询

var query1 = list
    .Where(s => s.Name != "")
    .GroupBy(g => g.Location)
    .Where(w => w.Select(s => s.Location).Count() > 1)
    .SelectMany(s => s)
    .GroupBy(g => g.id)
    .Where(w => w.Select(s => s.id).Count() > 1)
    .SelectMany(s => s)
    .ToList();
Console.WriteLine("output\n" + string.Join("\n", query1));

Returns

{ id = 3, Name = E, Location = LocationB }
{ id = 3, Name = R, Location = LocationB }
{ id = 5, Name = U, Location = LocationC }
{ id = 5, Name = S, Location = LocationC }
{ id = 5, Name = S, Location = LocationD }

vs我真正想要的

{ id = 3, Name = E, Location = LocationB }
{ id = 3, Name = R, Location = LocationB }
{ id = 5, Name = U, Location = LocationC }
{ id = 5, Name = S, Location = LocationC }

LocationD 的 ID 为 4 和 5,所以它应该被过滤掉,但我没能这样做。我究竟做错了什么?我该如何更正它?

idLocation 分组。并得到 .Count() 多于 1.

var query1 = list
    .Where(s => s.Name != "")
    .GroupBy(g => new { g.Location, g.id })
    .Where(g => g.Count() > 1)
    .SelectMany(g => g)
    .ToList();

Sample demo

给定

var list = new[]
{
   new { id = 3, Name = "", Location = "LocationA" },
   new { id = 2, Name = "", Location = "LocationA" },
   new { id = 1, Name = "T", Location = "LocationB" },
   new { id = 2, Name = "H", Location = "LocationB" },
   new { id = 3, Name = "E", Location = "LocationB" },
   new { id = 3, Name = "R", Location = "LocationB" },
   new { id = 5, Name = "U", Location = "LocationC" },
   new { id = 5, Name = "S", Location = "LocationC" },
   new { id = 5, Name = "S", Location = "LocationD" },
   new { id = 4, Name = "O", Location = "LocationD" },
   new { id = 4, Name = "Z", Location = "LocationE" },
};

例子

var results = list
   .Where(s => s.Name != "")
   .GroupBy(x => new {x.id, x.Location})
   .Where(g => g.Count() > 1)
   .SelectMany(y => y);

foreach (var result in results)
   Console.WriteLine($"{result.id}, {result.Name}, {result.Location}");

输出

3, E, LocationB
3, R, LocationB
5, U, LocationC
5, S, LocationC