linq查询输出的奇怪顺序
我有大量的int值linq查询输出的奇怪顺序,linq,c#-4.0,group-by,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
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除的数字是50
第二个可以被5除的数字是9四,
第三个可以被5除的数字是8三,
第四个可以被5除的数字是6一,
第五个可以被5除的数字是7二,
我有这样的工作小组的介绍。我错在哪里
问题:
按需要的顺序添加组。这是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
这使得be相信在组操作上没有排序,而是按照找到的顺序收集数字,第一个数字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个next 4值,68个next 3插槽值,76个next 1插槽,87个next 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%有意义的如何/为什么它发生。你看到的顺序是我所期望的;你为什么认为应该有所不同?我认为你对GroupBy的工作原理做出了错误的假设。你对期望顺序的解释很奇怪,所有的数字都可以除以5,只是它们不能完全分开。另外,你的模运算不是除法运算,所以你先假设数大于5是错误的。@Simeon Pilgrim,谢谢!回答这个问题,我会记下来。你是说我上面关于除法和模的评论是造成混乱的根本原因吗?所以我应该回答这个问题?是的,第一个数字是正确的。但是下一个值并不是按照它们在一个整体中所处的顺序排列的。它们完全是按照提供的顺序排列的。好的。那int[]oo={16,24,1,2,4,58,33,46,64,75}呢;如果跑完,1,4,2,3,0,你会期望什么?