可枚举给出意想不到的输出

发布于 2024-08-26 05:00:38 字数 741 浏览 8 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

温折酒 2024-09-02 05:00:38

Enumerable.Range指定要生成的整数数量,不是范围内的最后一个整数。

如有必要,可以很容易地构建自己的方法,或更新现有的 Foo.Range 方法,以生成从 startend 的范围参数。

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 from start and end parameters.

〆凄凉。 2024-09-02 05:00:38

Second parameter of Range is the numbers of items to produce.

绝對不後悔。 2024-09-02 05:00:38

为什么不是结束而是计数?

如果有起点和终点,如何枚举空范围?例如,假设屏幕上有一个文本缓冲区和一个选择,并且选择是从字符 12 开始到字符 12 结束的单个字符。如何枚举该范围?您枚举从第 12 个字符开始的一个字符。

现在假设选择的是零个字符。你如何枚举它?如果你有开始、大小,你只需将大小传递为零即可。如果你有开始、结束,你会做什么?你不能传递 12 和 12。

现在你可能会说“好吧,如果它是一个空范围,就不要枚举它”。所以你最终采用的代码应该看起来像这样:

var results = from index in Range(selectionStart, selectionSize)
              where blah blah blah
              select blah;

而不是写出

IEnumerable<Chicken> results = null;
if (selectionSize == 0)
{
    results = Enumerable.Empty<Chicken>();
}
else
{
    results = from index in Range(selectionStart, selectionEnd)
              where blah blah blah
              select blah;
}

伤害我眼睛的代码。

Why is it not end but count?

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:

var results = from index in Range(selectionStart, selectionSize)
              where blah blah blah
              select blah;

and instead writing

IEnumerable<Chicken> results = null;
if (selectionSize == 0)
{
    results = Enumerable.Empty<Chicken>();
}
else
{
    results = from index in Range(selectionStart, selectionEnd)
              where blah blah blah
              select blah;
}

which hurts my eyes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文