我有大量的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
我有这样的工作组介绍。我哪里错了?
问题:
为什么linq会改变顺序?
为什么我有这么奇怪的命令?
答案 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%了解它是如何/为什么会发生的。