我有一组数字,我试图查看数组中出现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;在结果视图中
答案 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
循环中打印到控制台),然后它将被执行。
以下是解释上述内容的代码段。将断点放在foreach
和Select
中,然后在现在使用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();
简单明了。