使用LINQ解决这个问题

时间:2011-09-13 12:03:44

标签: c# linq linq-to-objects

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

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

感谢。

1 个答案:

答案 0 :(得分: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>,因此,通过文档页面定义,它是共享公共密钥的TeleDBData项的集合({{1} }})。 int?groups,所有这些都是IEnumerable<IGrouping<int?, TeleDBData>>方法的标准程序。

您希望对Enumerable.GroupBy执行的两项操作是访问其Key属性以查找密钥并对其进行枚举以处理分组的元素。我们在上面的代码中正在做这两件事。

对于IGrouping<,> lambda中的n,它只是依次代表GroupBy中的每个项目;因此,它的类型为eqList。我选择TeleDBData作为参数名称作为“node”的缩写。