【问题标题】:Using LINQ to find three or more matching records使用 LINQ 查找三个或更多匹配记录
【发布时间】:2011-09-13 12:03:44
【问题描述】:

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

我有一个表,有 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】:

    您只需要相应地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.

    其他信息

    在上面的代码中,g 是一个IGrouping&lt;int?, TeleDBData&gt;,因此,根据文档页面的定义,它是共享一个公共键(即int?)的TeleDBData 项的集合。 groupsIEnumerable&lt;IGrouping&lt;int?, TeleDBData&gt;&gt;,所有这些都是 Enumerable.GroupBy 方法的标准过程。

    您想要对IGrouping&lt;,&gt; 做的两件事是访问其Key 属性以查找键并对其进行枚举以处理分组的元素。我们在上面的代码中做了这两个。

    至于GroupBy lambda 中的n,它只是依次代表eqList 中的每一项;它的类型是TeleDBData。我选择n作为参数名称作为“节点”的缩写。

    【讨论】:

    • 非常感谢!你能帮我理解变量'n'和'g'的类型吗?
    • 首先,再次感谢!其次,对不起,我现在感觉有点傻,但我不明白为什么变量'n'代表eqList中的每一项。我知道“n”代表 TeleDBData 类型,但我不明白为什么它代表我集合中的每个项目。你能再帮我一次吗?
    • @RHaguiuda: n =&gt; n.RootID 是一个函数,它为每个节点执行一次以生成该节点的密钥(然后分组将基于这些密钥)。 “每个”是我说“所有节点将一个接一个地馈送到此功能”的方式。我还要说,在foreach(var x in items) 中,x 代表“每个”项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多