如何在 LINQ 组集合中查找重复项

问题描述 投票:0回答:1

我想编写一个 LINQ 查询来检查我的

User
对象中是否存在重复的
InfoObject
数据。

在下图中,我想按

Code
(即
XYZ
)进行分组,并检查该组中是否有一个
User
具有多个
Type
。用户模型包含
Name
(例如 John)和
Value
(1 表示已选择)。

我的模型类如下:

public class InfoObject
{
    public string Code { get; set; }
    public string Type { get; set; }
    public List<User> Users { get; set; }
}

public class User
{
    public string Name { get; set; }
    public string Value { get; set; }
}

无效案例: John 不允许同时拥有 A 和 B 类型

Code          Type          John          Luke          Tim
XYZ           A             1             1             -
XYZ           B             1             -             1

有效案例:每个用户只能有一种类型

Code          Type          John          Luke          Tim
XYZ           A             -             1             -
XYZ           B             1             -             1

实现此目的的正确 LINQ 查询是什么?谢谢!

c# linq grouping
1个回答
0
投票

您可以展平

InfoObject
层次结构,然后按用户名分组并保留具有超过 1 个唯一代码的项目:

IEnumerable<InfoObject> data = ...;

var invalidUserNames = data
    // flatten with SelectMany:
    .SelectMany(o => o.Users
        .Where(user => user.Value == "1") // assuming you want to check only "selected"
        .Select(user => (user.Name, Obj: o))) 
    .GroupBy(t => t.Name) // assuming Name uniquely identifies user
    .Select(gr => (Name: gr.Key, Count: gr.Select(t => t.Obj.Code).Distinct().Count()))
    .Where(t => t.Count > 1)
    .Select(t => t.Name)
    .ToArray();

您可以操作

Select
来仅公开最终结果所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.