我有这样一段代码,它可以根据整数中每个数字的数量对整数的IEnumerable进行排序。
var ints = new List<int>() { 66, 7, 9, -5, -22, 67, 122, -333, 555, -2 };
var ordered = ints.OrderBy(x =>
{
x = Math.Abs(x);
Console.WriteLine($"Getting length of {x}");
int len = 0;
while (x >= 1)
{
len++;
x /= 10;
}
return len;
});
Console.WriteLine("After OrderBy");
Console.WriteLine("Fetching first item in ordered sequence");
Console.WriteLine($"First item is {ordered.First()}");
Console.WriteLine(string.Join(" ", ordered));
因此,当程序在获取
ordered
序列中的第一项时遇到行时,在那一刻,IEnumerable正在被排序(我收到输出行Getting length of XXX
),因为OrderBy是延迟执行的,这很清楚。但是,为什么当程序运行
Console.WriteLine(string.Join(" ", ordered));
时我又再次收到这个输出呢?IEnumerable再次排序了吗?(它不是已经排序了吗?)
x.ToString().Length
测量该数字的长度会更容易和直接。 :) - AlexMath.Abs(x)
进行排序,结果几乎一样的。 - monoh_