使用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找到它们?
你只需要相应的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
项的集合。groups
是IEnumerable<IGrouping<int?, TeleDBData>>
,所有这些都是Enumerable.GroupBy
方法的标准程序。
对于IGrouping<,>
,您想做的两件事是访问其Key
属性以查找键并枚举它以处理分组元素。我们在上面的代码中做了这两件事。
对于GroupBy
lambda中的n
,它简单地依次表示eqList
中的每一项;因此,它的类型是TeleDBData
。我选择n
作为参数名,作为node的缩写