C#Linq查找具有多个group by的重复项

kar*_*ren 8 c# linq

我在c#中有一个列表:

List<Data> uData = new List<uData>();
Run Code Online (Sandbox Code Playgroud)

其中uData从UI填充为:

{
   Id: 1,
   Name: "Smith",
   Input: "7,8",
   Output: "Output1",
   CreatedBy: "swallac",
   CreatedON: "12/01/2018"
},
{
   Id: 2,
   Name: "Austin",
   Input: "9,10",
   Output: "Output1",
   CreatedBy: "amanda",
   CreatedON: "12/03/2018"
},
{
   Id: 3,
   Name: "Smith",
   Input: "22,22",
   Output: "Output2",
   CreatedBy: "swallac",
   CreatedON: "12/01/2018"
},
{
   Id: 4,
   Name: "Smith",
   Input: "9,8",
   Output: "Output2",
   CreatedBy: "aaa",
   CreatedON: "12/01/2018"
},
{
   Id: 5,
   Name: "Peter",
   Input: "7,8",
   Output: "Output3",
   CreatedBy: "swallac",
   CreatedON: "12/02/2018"
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是在"输出"键上搜索此列表,并找出"Input"和CreatedBy键的相应组合值中是否有重复项.

例如,在上面的示例列表中,我有三个输出:Output1,Output2,Output3.现在,对于输出值为"Output1"和"Output3"的列表,相应的"Input"和"CreatedBy"键值在此处重复.值为"7,8"和"swallac"作为组合值.这是我想强调的

为此,我尝试了以下查询:

var myList = uData.GroupBy(l => l.Ouput)
                  .SelectMany(g => g.GroupBy(x => (x.Input, x.CreatedBy)).Where(x => x.Count() > 1))
                  .SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)

这不会给我任何错误但是没有给出我想要的结果,因为它列出了所有数据.我在这里想念的是什么

- 更新 - -

之前我想要输入不应该在一个输出中重复,因为我有以下查询.

uData.GroupBy(l => l.Ouput)
    .Any(g => g.GroupBy(x => x.Input).Any(x => x.Count() > 1))
Run Code Online (Sandbox Code Playgroud)

现在我想要另一个查询来检查Input和CreatedBy的组合是否在列表中重复.

我根据建议尝试了上面发布的查询和下面的查询:

uData.GroupBy(g=> new {g.CreatedBy,g.Input})
    .Where(w=>w.Count() > 1)
Run Code Online (Sandbox Code Playgroud)

但这会返回所有列表而不是重复列表

更新以添加示例链接:

https://dotnetfiddle.net/HWMYp6

我在上面的链接中创建了这个例子.

在示例中,我想标记具有id 10的集合,其中输出(output5)作为副本,作为输入的组合,并且在id 1,2,3之前已经存在(所有这些都属于output1).因此,输入和createby的基本组合不应该在另一组上重复.参考键是输出.对不起,如果我的帖子不是很清楚.我试过了.

Ous*_* D. 5

看来您只想按“创建者”和“输入”进行分组,在这种情况下,对当前查询进行轻微修改就足够了:

var result = uData.GroupBy(x => (x.Input, x.CreatedBy))
                  .Where(x => x.Count() > 1)
                  .SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)

我只是删除了该GroupBy字段Output

  • GroupBy读作“按输入和创建者分组”
  • Where读作“保留有两个或更多项目的组”
  • SelectMany将嵌套序列折叠成IEnumerable<Data>

更新:

根据您的编辑,您正在寻找:

var myList = uData.GroupBy(x => new {x.Input, x.CreatedBy})
                  .SelectMany(x => x.GroupBy(z => z.Output).Skip(1))
                  .SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)