林克以怪异的方式组队

本文关键字:方式组 林克 | 更新日期: 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();