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

本文关键字:记录 三个 查找 LINQ 使用 | 更新日期: 2023-09-27 18:08:39

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

我有一个表,有2列(ID和根)。该表被转换成一个简单的节点结构为:

的List of Nodes。
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找到它们?

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

你只需要相应的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);
    }
}

实际操作

<<p> 附加信息/strong>:

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

对于IGrouping<,>,您想做的两件事是访问其Key属性以查找键并枚举它以处理分组元素。我们在上面的代码中做了这两件事。

对于GroupBy lambda中的n,它简单地依次表示eqList中的每一项;因此,它的类型是TeleDBData。我选择n作为参数名,作为node的缩写