C#Linq查找多个分组依据的重复项

时间:2018-12-13 14:46:29

标签: c# linq

我在c#中有一个列表为:

List<Data> uData = new List<uData>();

从UI填充uData的位置:

{
   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"
}

我想做的是在“输出”键上搜索此列表,并找出“输入”和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);

这不会给我任何错误,但由于列出了所有数据,所以没有给我想要的结果。我在这里想念什么。

-更新----

之前,我希望输入不应该在一个输出中重复,因为我有以下查询。

uData.GroupBy(l => l.Ouput)
    .Any(g => g.GroupBy(x => x.Input).Any(x => x.Count() > 1))

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

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

uData.GroupBy(g=> new {g.CreatedBy,g.Input})
    .Where(w=>w.Count() > 1)

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

已更新以添加示例链接:

https://dotnetfiddle.net/HWMYp6

我已经在上面的链接中创建了示例。

在该示例中,我想将ID为10的集合标记为output(output5),作为输入的重复组合,并由id创建的ID 1,2,3中已经存在的创建者(所有这些都属于output1)。因此,基本上输入和createby的一种组合不应在另一组上重复。参考键为输出。 抱歉,如果我的初始帖子不太清楚。我尝试过。

3 个答案:

答案 0 :(得分:1)

您想知道任何输出是否存在匹配的Input&CreatedBy,因此您要按Input&CreatedBy分组,结果的计数仅大于1。

var myList = uData.GroupBy(g=> new {g.CreatedBy,g.Input})
    .Where(w=>w.Count() > 1)

答案 1 :(得分:1)

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

var result = uData.GroupBy(x => (x.Input, x.CreatedBy))
                  .Where(x => x.Count() > 1)
                  .SelectMany(x => x);

我只是删除了GroupBy字段中的Output

  • GroupBy读为“按输入和创建dBy分组”
  • 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);

答案 2 :(得分:0)

您的代码根本无法运行,但是如果我修复了它的语法,它似乎可以按照您的预期工作。

var myList = uData.GroupBy(l => l.Output)
              .SelectMany(g => g.GroupBy(x => new {x.Input, x.CreatedBy}).Where(x => x.Count() > 1))
              .SelectMany(x => x);

用小提琴进行显示(我修改了ID = 3和Id = 5的条目以创建重复项): https://dotnetfiddle.net/r5mVKw