簡體   English   中英

如何在 C# 中創建整數序列?

[英]How to create a sequence of integers in C#?

F# 具有允許創建序列的序列:

seq { 0 .. 10 }

創建從 0 到 10 的數字序列。

C# 中是否有類似的東西?

您可以使用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++;
    }
}

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

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

我更喜歡這種方法的靈活性。

例如,如果我想要evens:

(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

PS 但要小心'indexes from end' 例如, ToEnumerable 擴展方法不適用於var seq = ^2..^0

我的實現:

    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到變量end的數字序列( 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 ZeroTo1000 = Series().Take(11);

如果您想要一個可以重復調用以生成遞增數字的函數,也許您想要類似的東西。

using System.Threading;

private static int orderNumber = 0;

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

當您調用Seq() ,它將返回下一個訂單號並增加計數器。

我的代碼中有這些功能

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

如果您還希望將生成的序列保存在變量中:

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

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

這在上面顯示的其他解決方案中是隱含的,但我也明確包含了所需的命名空間,以使其按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM