从LINQ查询的结果视图中提取数字的不同方法
本文关键字:数字 方法 提取 视图 LINQ 查询 结果 | 更新日期: 2023-09-27 18:11:25
我有一个数字数组,我试图查看数组中出现3次的数字的值。例如,这里有一个数字数组[4,4,4,3,3],当我把它作为骰子传递到这个查询中时:
var triples = dice.GroupBy(x => x).Where(g => g.Count() > 2).Select(y => y.Key);
我可以在三元组对象的结果视图中看到4
,这正是我想要的,但我如何将该数字提取出来并放入变量中使用?我还不太了解林克。谢谢
现在,我得到类型为System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Linq.IGrouping<int,int>,int>
的对象作为三元组的值,当我深入到该对象时,我可以在结果视图
如果您需要获得第一个数字,请使用first((扩展方法
var firstTriple = dice.Where(...).First();
或者Single,如果你想确保它只是一个项目,否则抛出一个异常。
如果您需要阵列
var triples = dice.Where(...).ToArray()
在获取数据之前,初始查询不会过滤任何值(调用ToArray((,First((,使用foreach迭代(。
var query = dice.Where(...); // not executed
query = query.GroupBy(...); // not executed
query = query.Select(...); // not executed
query = query.OrderBy(); // not executed
var result = query.ToArray();// executed only at this moment;
// or in foreach loop
foreach(var item in query){ //
//
}
添加ToList
/ToArray
/First
/FirstOrDefault
:
var triples = dice.GroupBy(x => x)
.Where(g => g.Count() > 2)
.Select(y => y.Key)
.ToList();
大多数linq方法都是不同的执行方式,这意味着它们不会在编写时执行,而是只有在需要具体结果时才执行。当调用类似ToList
/ToArray
/First
/FirstOrDefault
/Sum
/Count
的方法时会发生这种情况。。。
如果没有上面的ToList
,您看到的是linq的"执行计划",当按下"结果视图"时,它实际上会执行它。
在正常的代码流中,您可能会在某个时刻实际使用triples
(例如,在foreach
循环中打印到控制台(,然后执行它。
这里有一个代码片段来解释上面的内容。在foreach
和Select
中设置断点,并按照现在的状态运行一次,然后用ToList()
运行一次。
List<int> data = new List<int> { 1, 1, 1, 2, 2, 3, 3, 3, 4 };
var triples = data.GroupBy(x => x)
.Where(g => g.Count() > 2)
.Select(y => y.Key); // put breakpoint here
foreach(var item in triples) //Put breakpoint here
{
Debug.Write(item);
}
有关更多信息,请阅读LINQ和延迟执行
var firstTriple = triples.FirstOrDefault();
简单明了。