linq查询输出的奇怪顺序

时间:2014-06-30 00:53:49

标签: linq c#-4.0 group-by

我有大量的int值。

int[] numbers= {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};

我将这些数字除以模数:

 var numberGroups=from n in numbers group n by n%5  into g select new { Remainder=g.Key, Numbers=g};

我有如此奇怪的结果顺序:

  // 0, 4, 1, 3, 2

在我看来,订单应该是:

  //0, 4, 3, 1, 2

因为第一个可以除以5的数字是5. // 0

可以除以5的第二个数字是9. // 4

可以除以5的第三个数字是8. // 3

可以除以5的第四个数字是6. // 1

可以除以5的第五个数字是7. // 2

我有这样的工作组介绍。我哪里错了?

问题:

  1. 为什么linq会改变顺序?

  2. 为什么我有这么奇怪的命令?

1 个答案:

答案 0 :(得分:1)

按需要的顺序添加组。哪个是group子句的输入顺序。给定5是第一个值,首先创建0组...这可以通过以下代码示例看到。

使用此代码:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

var numberGroups = from n in numbers group n by n % 5 into g select new { Remainder = g.Key, Numbers = g };

foreach(var ng in numberGroups)
{
    Console.Write("{0} - ", ng.Remainder);
    foreach (var v in ng.Numbers)
    {
        Console.Write(" {0}", v);
    }
    Console.WriteLine();
}

我得到了

0 - 5 0
4 - 4 9
1 - 1 6
3 - 3 8
2 - 7 2

这使得相信组操作没有排序,而是按照它们被找到的顺序收集数字,第一个数字5,结果为余数0,因此第一个输出桶为0.我们可以测试这个把9放在第一位然后我们得到

4, 0, 1, 3, 2

要证明他们按照处理顺序添加添加到存储桶中,请使用这些数字

int[] numbers = { 15, 24, 31, 43, 59, 68, 76, 87, 92, 100 };

我们得到了

0 -  15 100
4 -  24 59
1 -  31 76
3 -  43 68
2 -  87 92

15添加第一个新插槽0,24是新插槽4,31净插槽1,43是新插槽3,59接下来4个值,68是下一个3个插槽值,76个下一个插槽,87个新插槽2, 92 next 2,100 next 0

证明这更有用:

int[] numbers = { 15, 25, 35, 45, 55, 65, 75, 85, 95, 105 };

我们得到了

0 -  15 25 35 45 55 65 75 85 95 105

可能不是你想要的方式,但是100%了解它是如何/为什么会发生的。