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


119

F#有序列,它允许创建序列:

seq { 0 .. 10 }

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

C#中有类似的东西吗?

Answers:


206

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

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

MSDN页面在这里


66
注意:这将创建一个从0开始的序列,其中包含10个项目(以9结尾)。如果您想要0 10,则第二个参数将是11。如果您需要一个实际的数组而不是IEnumerable<int>,请包含call .ToArray()
Anthony Pegram


19

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

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

所谓“更复杂”,是指“方便而又开始的地方,而不是元素的数量”?否则我会失去你的意思。🤔
鲁芬

1
我相信我正在考虑OddSequence EvenSequence其他自定义范围。if (++n1 % 2 == 0) yield return n1, 例如。已经有几天了;)
Josiah Ruddell

哈,是的,我想一两天。或几千。; ^)
鲁芬

7

Linq投影,索引索引过载(i)很少使用:

(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)

我真的很喜欢这个,但同时也感觉有些古怪!
Zimano

大声笑:-)这只是索引器重载的绝佳创意!
Zimano

2

在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

PS但请注意“从末尾开始的索引”。例如,ToEnumerable扩展方法不适用于var seq = ^2..^0


1

我的实现:

    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

原来在这里回答


如果要枚举一个变量中的数字序列(IEnumerable<int>),请尝试0end

Enumerable.Range(0, ++10);

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


如果需要无限的线性级数,可以编写如下函数

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

你可以像这样使用

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

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

using System.Threading;

private static int orderNumber = 0;

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

呼叫时Seq(),它将返回下一个订单号并增加计数器。


0

我的代码中有这些功能

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)代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.