首先,我将描述我的表格结构。
我有表,有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找到它们?
感谢。
答案 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 强>
其他信息:
在上面的代码中,g
是IGrouping<int?, TeleDBData>
,因此,通过文档页面定义,它是共享公共密钥的TeleDBData
项的集合({{1} }})。 int?
是groups
,所有这些都是IEnumerable<IGrouping<int?, TeleDBData>>
方法的标准程序。
您希望对Enumerable.GroupBy
执行的两项操作是访问其Key
属性以查找密钥并对其进行枚举以处理分组的元素。我们在上面的代码中正在做这两件事。
对于IGrouping<,>
lambda中的n
,它只是依次代表GroupBy
中的每个项目;因此,它的类型为eqList
。我选择TeleDBData
作为参数名称作为“node”的缩写。