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

时间:2016-10-03 20:52:29

标签: c# .net linq

我有一组数字,我试图查看数组中出现3次数字的值。例如,这里是一个数字数组[4,4,4,3,3],当我将它作为骰子传递给这个查询时:

var triples = dice.GroupBy(x => x).Where(g => g.Count() > 2).Select(y => y.Key);

我可以在三元组对象的结果视图中看到4这是我想要的但是如何将该数字拉出并变成要使用的变量?我还不太了解LINQ。谢谢!

现在我得到类型为System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Linq.IGrouping<int,int>,int>的对象作为三元组的值,当我潜入对象时,我可以看到我想要的值&#34; 4&#34;在结果视图中

3 个答案:

答案 0 :(得分:1)

如果您需要获得第一个号码至少发生3次,请使用First()扩展方法

var firstTriple = dice.Where(...).First();

或单人如果你想确保它只有一个项目,否则抛出异常。

如果您需要数组

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){  // 
   //
}

答案 1 :(得分:1)

添加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,您所看到的就是&#34;执行计划&#34;那个linq和按下&#34;结果视图&#34;它实际上执行它。

在您正常的代码流中,您可能会在某个时刻实际使用triples(例如在foreach循环中打印到控制台),然后它将被执行。

以下是解释上述内容的代码段。将断点放在foreachSelect中,然后在现在使用wat时运行它,使用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 and Deferred Execution

答案 2 :(得分:0)

var firstTriple = triples.FirstOrDefault();

简单明了。