使用LINQ查找三个或更多匹配记录

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

首先,我将描述我的表结构。

我有表,有2列(ID和Root)。该表将转换为简单的节点结构为的节点列表:

struct Node
{
    public int id;
    public int root;
}

我需要在此列表中找到根数等于或大于3的所有条目。

示例:

struct TeleDBData
{
    public int ID;
    public int? RootID;
}

private void InitList()
{
    var eqList = new List<TeleDBData>();

    TeleDBData root = new TeleDBData();
    root.ID = 1;

    TeleDBData node1 = new TeleDBData();
    node1.ID = 2;
    node1.RootID = 1;

    TeleDBData node2 = new TeleDBData();
    node2.ID = 3;
    node2.RootID = 1;

    TeleDBData node3 = new TeleDBData();
    node3.ID = 4;
    node3.RootID = 1;

    TeleDBData node4 = new TeleDBData();
    node4.ID = 5;
    node4.RootID = 2;

    eqList.Add(root);
    eqList.Add(node1);
    eqList.Add(node2);
    eqList.Add(node3);
    eqList.Add(node4);
}

运行查询后,它将返回node1,node2和node3。

如何使用LINQ找到它们?

c# linq linq-to-objects
1个回答
4
投票

您只需要相应地GroupBy

var groups = eqList.GroupBy(n => n.RootID).Where(g => g.Count() >= 3);

foreach (var g in groups) {
    Console.Out.WriteLine("There are {0} nodes which share RootId = {1}",
                          g.Count(), g.Key);
    foreach (var node in g) {
        Console.Out.WriteLine("    node id = " + node.ID);
    }
}

See it in action

其他信息

在上面的代码中,gIGrouping<int?, TeleDBData>,因此,根据文档页面定义,它是共享公用密钥(即IGrouping<int?, TeleDBData>)的TeleDBData个项目的集合。 int?groups,所有这些都是IEnumerable<IGrouping<int?, TeleDBData>>方法的标准过程。

您想对Enumerable.GroupBy执行的两件事是访问其IGrouping<,>属性以找到键并对其进行枚举以处理分组的元素。我们在上面的代码中都完成了这两项。

关于Key lambda中的Key,它仅依次表示n中的每个项目;因此,其类型为GroupBy。我选择eqList作为参数名称作为“ node”的缩写。

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