林克以怪异的方式组队
本文关键字:方式组 林克 | 更新日期: 2023-09-27 18:19:48
我有一个包含三个元素的int的简单列表,所有元素都设置为1000。如果我按值对这个列表进行分组,我仍然会得到三个元素,而不是一个。为什么?
var l = new List<int> {1000, 1000, 1000};
var gr = from i in l
group i by new
{
j = i
}
into g1
from g in g1
select new
{
Id = g1.Key.j
};
var count = gr.Count(); // <- count is 3!
松开第二个from
var l = new List<int> {1000, 1000, 1000};
var gr = from i in l
group i by new
{
j = i
}
into g1
select new
{
Id = g1.Key.j
};
var count = gr.Count(); // <- count is 1!
这是因为您再次投影分组项目。它返回IEnumerable<IGrouping<int,int>>
,而您正在用from g in g1
枚举IEnumerable<int>
,这意味着您将获得组1000
中的项,从而获得计数3
。
以下查询将给您正确的结果:-
var gr = from i in l
group i by i
into g1
select new
{
Id = g1.Key
};
这里gr.Count()
将是1
,因为我们投影的是Key
,而不是该组内的项。
使用方法语法:
您当前的查询是:l.GroupBy(x => x).SelectMany(x => x)
,因此它将投影组中的所有项目,从而计数3
。
如果您想对密钥进行计数,则:l.GroupBy(x => x).Select(x => x.Key)
,这将返回1
,因为它将创建一组1000
。
我认为您正在努力实现这一点:
var l = new List<pairs>
{
new pairs {Index = 0, Value = 1000},
new pairs {Index = 1, Value = 1000},
new pairs {Index = 2, Value = 1000},
};
var gr = l.GroupBy(a => a.Value);
var count = gr.Count(); // <- count is 1
Pairs是一个简单的POCO:
internal class pairs
{
public int Value { get; set; }
public int Index { get; set; }
}
group by
子句为您提供密钥以及组中的所有项。您选择的是项目,而不是密钥。
例如,试试这个:
var gr = from i in l
group i by i into g1
select g1;
var count = gr.Count();
var itemCount = gr.First().Count();