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

F # 的 序列允许创建序列:

seq { 0 .. 10 }

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

C # 中有类似的东西吗?

65321 次浏览

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

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

MSDN 页面 给你

Enumerable.Range(0, 11);

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

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

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

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

我的实施方案:

    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;
}
}

原来是 在这里回答


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

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()时,它将返回下一个订单号并增加计数器。

使用很少使用的 索引器超载(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)

在 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

但是要小心使用 ‘从头开始索引’。例如,ToEnumable 扩展方法无法使用 var seq = ^2..^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;
}
}

这有助于减少(i)代码的一些开销。

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

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


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

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