C# select 使用组复制

C# select duplicate using group

我想 select 仅来自任何组多次包含相同 ID 的非空白名称:

数据设置

var a1 = new { id = 3, Name = "", Group = "GroupA" };
var a2 = new { id = 2, Name = "", Group = "GroupA" };
var a3 = new { id = 3, Name = "", Group = "GroupA" };
var b1 = new { id = 4, Name = "B", Group = "GroupB" };
var b2 = new { id = 5, Name = "B", Group = "GroupB" };
var b3 = new { id = 5, Name = "B", Group = "GroupB" };
List<dynamic> group = new List<dynamic>();
group.Add(a1);
group.Add(a2);
group.Add(a3);
group.Add(b1);
group.Add(b2);
group.Add(b3);

查询:

var query1 = group.ToList()
    .Where(s=>s.Name != "")
    .GroupBy(x =>x.Group)
    .Where(g => g.Count() > 1)
    .SelectMany(y => y)
    .ToList();
Console.WriteLine("output\n" + string.Join("\n", query1));

Returns

 id = 4, Name = B, Group = GroupB 
 id = 5, Name = B, Group = GroupB 
 id = 5, Name = B, Group = GroupB 

但我想要的是:

 id = 5, Name = B, Group = GroupB 
 id = 5, Name = B, Group = GroupB 

我做错了什么?

您正在将 GroupBy 应用于 Group 属性。不要按 Group 属性 分组,而是使用 id 属性、

输入

var list = new[]
{
    new {id = 3, Name = "", Group = "GroupA"},
    new {id = 2, Name = "", Group = "GroupA"},
    new {id = 3, Name = "", Group = "GroupA"},
    new {id = 4, Name = "B", Group = "GroupB"},
    new {id = 5, Name = "B", Group = "GroupB"},
    new {id = 5, Name = "B", Group = "GroupB"}
};

解法:

var query1 = list.ToList()
    .Where(s=>s.Name != "")
    .GroupBy(x =>x.id)  
               //^^^^^ This change you need to do  
    .Where(g => g.Count() > 1)
    .SelectMany(y => y)
    .ToList();

输出

5, B, GroupB
5, B, GroupB

Try it online

根据需要分组 id and/or Name

.GroupBy(x => new {x.id, x.Name})

给定

var list = new[]
{
   new {id = 3, Name = "", Group = "GroupA"},
   new {id = 2, Name = "", Group = "GroupA"},
   new {id = 3, Name = "", Group = "GroupA"},
   new {id = 4, Name = "B", Group = "GroupB"},
   new {id = 5, Name = "B", Group = "GroupB"},
   new {id = 5, Name = "B", Group = "GroupB"}
};

用法

var results = list
   .Where(s => s.Name != "")
   .GroupBy(x => new {x.id, x.Name})
// .GroupBy(x => x.id) <- depending on your needs
   .Where(g => g.Count() > 1)
   .SelectMany(y => y);

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

输出

5, B, GroupB
5, B, GroupB