首先,我将描述我的表结构。
我有表,有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找到它们?
您只需要相应地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<int?, TeleDBData>
,因此,根据文档页面定义,它是共享公用密钥(即IGrouping<int?, TeleDBData>
)的TeleDBData
个项目的集合。 int?
是groups
,所有这些都是IEnumerable<IGrouping<int?, TeleDBData>>
方法的标准过程。
您想对Enumerable.GroupBy
执行的两件事是访问其IGrouping<,>
属性以找到键并对其进行枚举以处理分组的元素。我们在上面的代码中都完成了这两项。
关于Key
lambda中的Key
,它仅依次表示n
中的每个项目;因此,其类型为GroupBy
。我选择eqList
作为参数名称作为“ node”的缩写。