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

标签 c# linq

我在 C# 中有一个列表:

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

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

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

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

--已更新---

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

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 且输出 (output5) 的集合标记为重复项,因为输入和创建者的组合已存在于 id 1、2、3 中(所有这些都属于 output1)。所以基本上 input 和 createby 的组合不应该在另一组上重复。引用键是输出。 抱歉,如果我最初的帖子不是很清楚。我试过了。

最佳答案

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

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

我只是删除了 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);

关于C# Linq 查找具有多个分组依据的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53764417/

相关文章:

c# - 使用 Linq Select 创建新的继承对象

c# - 用 Let 过滤

c# - 默认 ASP.NET MVC 上的 https

c# - 在 C# 中替换字符串中的 unicode 字符

c# - 为什么这个 C# 代码没有编译?

c# - Linq:只为 Where 和 OrderBy 调用相同的方法一次而不是两次?

c# - 使用键和列表的 Linq to Dictionary

.net - 有没有类似于python的linq枚举的东西

c# - 使用没有服务引用的 HttpWebRequest 动态使用 Web 服务

c# - FileSystemWatcher 不触发事件