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

发布于 2024-12-04 08:18:28 字数 932 浏览 0 评论 0 原文

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

我有一个表,有 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 找到它们?

First, I'll describe my table structure.

I have table, with 2 columns (ID and Root). This table is converted to a List of Nodes where the simple node structure is:

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

I need to find all entries in this List where there's 3 or more roots equals.

Example:

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);
}

After running the query, it will return node1, node2 and node3.

How can I find them using LINQ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

所谓喜欢 2024-12-11 08:18:28

您只需相应地 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);
    }
}

查看实际操作

其他信息

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

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

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

You just need to GroupBy accordingly:

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.

Additional info:

In the code above, g is an IGrouping<int?, TeleDBData> so, by the documentation page definition, it's a collection of TeleDBData items that share a common key (which is an int?). groups is an IEnumerable<IGrouping<int?, TeleDBData>>, all of this is standard procedure for the Enumerable.GroupBy method.

The two things you would want to do with an IGrouping<,> is access its Key property to find the key and enumerate over it to process the grouped elements. We 're doing both of this in the above code.

As for the n in the GroupBy lambda, it simply represents each one of the items in eqList in turn; it follows that its type is TeleDBData. I picked n as the parameter name as an abbreviation of "node".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文