Linq按条件分组出现奇怪现象

3

我有一个包含三个元素的整数列表,它们的值都设置为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!

你正在创建一个名为 g1 的分组。然后,你对该分组的每个项目进行投影,从而将该组分解为其组成部分。结果是你所期望的;3个元素。 - Asad Saeeduddin
4个回答

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!

2

这是因为你再次投影已分组的项。 它返回 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),所以它会投影出组内的所有元素,因此 Count 为 3

如果你想要计算 Key 的数量,则可以使用:l.GroupBy(x => x).Select(x => x.Key) 这将返回一个单一的组 1000,因此 Count 是 1


1
我认为你正在尝试实现这个目标:

        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; }
}

0

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接