可枚举给出意想不到的输出
class Foo
{
public static IEnumerable<int> Range(int start, int end)
{
return Enumerable.Range(start, end);
}
public static void PrintRange(IEnumerable<int> 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
这段代码有什么问题?发生什么事了?
class Foo
{
public static IEnumerable<int> Range(int start, int end)
{
return Enumerable.Range(start, end);
}
public static void PrintRange(IEnumerable<int> 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();
}
}
Expected Output:
10 11 12 13 14 15 16 17 18 19 20
Actual Output:
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
What is the problem with this code? Whats happening?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Enumerable.Range
指定要生成的整数数量,不是范围内的最后一个整数。
如有必要,可以很容易地构建自己的方法,或更新现有的
Foo.Range
方法,以生成从start
到end
的范围参数。The second parameter of
Enumerable.Range
specifies the number of integers to generate, not the last integer in the range.If necessary, it's easy enough to build your own method, or update your existing
Foo.Range
method, to generate a range fromstart
andend
parameters.范围
<的第二个参数/a> 是要生产的物品数量。Second parameter of
Range
is the numbers of items to produce.如果有起点和终点,如何枚举空范围?例如,假设屏幕上有一个文本缓冲区和一个选择,并且选择是从字符 12 开始到字符 12 结束的单个字符。如何枚举该范围?您枚举从第 12 个字符开始的一个字符。
现在假设选择的是零个字符。你如何枚举它?如果你有开始、大小,你只需将大小传递为零即可。如果你有开始、结束,你会做什么?你不能传递 12 和 12。
现在你可能会说“好吧,如果它是一个空范围,就不要枚举它”。所以你最终采用的代码应该看起来像这样:
而不是写出
伤害我眼睛的代码。
How do you enumerate an empty range if you have start and end points? For example, suppose you have a text buffer on the screen and a selection, and the selection is of a single character starting at character 12 and ending at character 12. How do you enumerate that range? You enumerate one character starting at character 12.
Now suppose the selection is ZERO characters. How do you enumerate it? If you have start, size, you just pass zero for size. If you have start, end, what do you do? You can't pass 12 and 12.
Now you might say "well, just don't enumerate it if its an empty range". So you end up taking code that ought to look like this:
and instead writing
which hurts my eyes.