从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>的对象作为三元组的值,当我深入到该对象时,我可以在结果视图

从LINQ查询的结果视图中提取数字的不同方法

中看到我想要的值"4">

如果您需要获得第一个数字,请使用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循环中打印到控制台(,然后执行它。


这里有一个代码片段来解释上面的内容。在foreachSelect中设置断点,并按照现在的状态运行一次,然后用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();

简单明了。