如何在C#中创建整数序列?

How to create a sequence of integers in C#?

提问人:Budda 提问时间:1/4/2011 最后编辑:JodrellBudda 更新时间:9/26/2022 访问量:69176

问:

F# 具有允许创建序列的序列

seq { 0 .. 10 }

创建从 0 到 10 的数字序列。

C# 中有类似的东西吗?

C# .NET F# 序列

评论


答:

233赞 alexn 1/4/2011 #1

您可以使用 .例:Enumerable.Range(0, 10);

var seq = Enumerable.Range(0, 10);

MSDN 页面。

评论

76赞 Anthony Pegram 1/4/2011
注意:这将创建一个从 0 开始的序列,其中包含 10 个项目(以 9 个项目结束)。如果需要 0 10,则第二个参数为 11。如果你需要一个实际的数组而不是 ,包括一个调用。IEnumerable<int>.ToArray()
42赞 Pauli Østerø 1/4/2011 #2
Enumerable.Range(0, 11);

生成指定范围内的整数序列。

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx

20赞 Josiah Ruddell 1/4/2011 #3

您可以创建一个简单的函数。这适用于更复杂的序列。否则应该做。Enumerable.Range

IEnumerable<int> Sequence(int n1, int n2)
{
    while (n1 <= n2)
    {
        yield return  n1++;
    }
}

评论

0赞 ruffin 7/27/2020
你所说的“更复杂”是指“你在哪里有开始和结束,而不是元素的数量”?否则我就错过了你的意思。🤔
1赞 Josiah Ruddell 7/28/2020
我相信我正在考虑或其他自定义范围。例如。已经好几天了;)OddSequenceEvenSequenceif (++n1 % 2 == 0) yield return n1
1赞 ruffin 7/28/2020
呵呵,是的,我想一两天。或者几千。;^)
1赞 Dicaste 6/8/2016 #4

我的实现:

    private static IEnumerable<int> Sequence(int start, int end)
    {
        switch (Math.Sign(end - start))
        {
            case -1:
                while (start >= end)
                {
                    yield return start--;
                }

                break;

            case 1:
                while (start <= end)
                {
                    yield return start++;
                }

                break;

            default:
                yield break;
        }
    }
0赞 Jodrell 4/10/2018 #5

最初在这里回答


如果要枚举从 到 的一系列数字 (),请尝试IEnumerable<int>010

Enumerable.Range(0, ++10);

在解释中,要获得从 0 到 10 的数字序列,您希望该序列从 0 开始(请记住,0 到 10 之间有 11 个数字,包括 0 和 10)。


如果你想要一个无限的线性级数,你可以写一个函数,如

IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
    while (true)
    {
        yield return k;
        k = (c * k) + n;
    }
}

你可以像这样使用

var ZeroTo10 = Series().Take(11);

如果你想要一个可以重复调用的函数来生成递增的数字,也许你想要类似的东西。

using System.Threading;

private static int orderNumber = 0;

int Seq()
{
    return Interlocked.Increment(ref orderNumber);
}

当您调用时,它将返回下一个订单号并增加计数器。Seq()

11赞 b_levitt 10/3/2018 #6

使用很少使用的索引器重载 (i) 的 Linq 投影:

(new int[11]).Select((o,i) => i)

我更喜欢这种方法,因为它具有灵活性。

例如,如果我想要偶数:

(new int[11]).Select((item,i) => i*2)

或者,如果我想要一个小时的 5 分钟增量:

(new int[12]).Select((item,i) => i*5)

或字符串:

(new int[12]).Select((item,i) => "Minute:" + i*5)

评论

0赞 Zimano 2/5/2020
我真的很喜欢这个,但同时也感觉有点骇人听闻!
0赞 Zimano 2/5/2020
哈哈:-)这只是对索引器重载的一个很好的创造性使用!
2赞 Matt Baran 5/22/2021
我觉得做更可读。Enumerable.Range(0, 12).Select( i => "Minute:" + i*5 )
2赞 Evgeniy Mironov 2/11/2020 #7

在 C# 8.0 中,可以使用索引和范围

例如:

var seq = 0..2;
var array = new string[]
{
    "First",
    "Second",
    "Third",
};

foreach(var s in array[seq])
{
    System.Console.WriteLine(s);
}
// Output: First, Second

或者,如果你想创建,那么你可以使用扩展:IEnumerable<int>

public static IEnumerable<int> ToEnumerable(this Range range)
{
   for (var i = range.Start.Value; i < range.End.Value; i++)
   {
       yield return i;
   }
}
...
var seq = 0..2;

foreach (var s in seq.ToEnumerable())
{
   System.Console.WriteLine(s);
}
// Output: 0, 1

P.S. 但要小心“从结尾开始的索引”。例如,ToEnumerable 扩展方法不适用于 。var seq = ^2..^0

0赞 haiduong87 2/21/2020 #8

我的代码中有这些函数

private static IEnumerable<int> FromZero(this int count)
    {
        if (count <= 0)
            yield break;

        for (var i = 0; i < count; i++)
        {
            yield return i;
        }
    }

    private static IEnumerable<int> FromOne(this int count)
    {
        if (count <= 0)
            yield break;

        for (var i = 1; i <= count; i++)
        {
            yield return i;
        }
    }

这有助于减少一些 for(i) 代码。

0赞 Indrajeet Patil 4/22/2022 #9

如果您还希望将生成的序列保存在变量中:

using System.Collections.Generic;
using System.Linq;

IEnumerable<int> numbersToPrint = Enumerable.Range(1, 11);

这在上面显示的其他解决方案中是隐含的,但我也明确地包括了所需的命名空间,以便按预期工作。