可以给出意想不到的输出
class Foo { public static IEnumerable Range(int start, int end) { return Enumerable.Range(start, end); } public static void PrintRange(IEnumerable r) { foreach (var item in r) { Console.Write(" {0} ", item); } Console.WriteLine(); } } class Program { static void TestFoo() { Foo.PrintRange(Foo.Range(10, 20)); } static void Main() { TestFoo(); } }
预期产出:
10 11 12 13 14 15 16 17 18 19 20
实际产量:
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
这段代码有什么问题? 发生了什么?
Enumerable.Range
的第二个参数指定要生成的整数数,而不是该范围中的最后一个整数。
如有必要,可以轻松构建自己的方法,或更新现有的Foo.Range
方法,从start
和end
参数生成范围。
Range
第二个参数是要生成的项目数。
它为什么不结束而是计数?
如果你有起点和终点,你如何枚举一个空的范围? 例如,假设您在屏幕上有一个文本缓冲区和一个选择,并且选择是从字符12开始到字符12结尾的单个字符。您如何枚举该范围? 您枚举从字符12开始的一个字符。
现在假设选择是ZERO字符。 你怎么列举它? 如果你有开始,大小,你只需要传递零大小。 如果你有开始,结束,你做什么? 你无法通过12和12。
现在你可能会说“好吧,如果它是一个空的范围,就不要枚举它”。 所以你最终得到的代码应该是这样的:
var results = from index in Range(selectionStart, selectionSize) where blah blah blah select blah;
而是写作
IEnumerable results = null; if (selectionSize == 0) { results = Enumerable.Empty (); } else { results = from index in Range(selectionStart, selectionEnd) where blah blah blah select blah; }
这伤害了我的眼睛。