如何在C#中创建具有整数序列的数组?

时间:2011-01-03 22:04:44

标签: c# .net f# sequence

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

seq { 0 .. 10 }

创建0到10之间的数字序列。

C#中有类似内容吗?

8 个答案:

答案 0 :(得分:184)

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

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

MSDN网页here

答案 1 :(得分:32)

Enumerable.Range(0, 11);

在指定范围内生成一系列整数。

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

答案 2 :(得分:17)

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

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

答案 3 :(得分:3)

使用很少使用的indexer overload (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)

答案 4 :(得分:2)

在C#8.0中,您可以使用Indices and ranges

例如:

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

答案 5 :(得分: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;
        }
    }

答案 6 :(得分:0)

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

Enumerable.Range(0, ++end);

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

如果你想要一个无限的线性系列,你可以写一个像

这样的函数
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(1001);

如果你想要一个功能,你可以反复调用以生成递增的数字,也许你想要的东西就像。

using System.Threading;

private static int orderNumber = 0;

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

当您致电Seq()时,它将返回下一个订单号并递增计数器。

答案 7 :(得分: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)代码。