C#で整数のシーケンスを作成する方法


119

F#には、シーケンスを作成できるシーケンスがあります。

seq { 0 .. 10 }

0から10までの数列を作成します。

C#にも同様のものはありますか?

回答:


206

使用できますEnumerable.Range(0, 10);。例:

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

こちらの MSDNページ。


66
注:これにより、0から始まり10アイテム(9で終わる)のシーケンスが作成されます。0 から 10が必要な場合、2番目のパラメーターは11になります。実際の配列が必要で、それが必要ないIEnumerable<int>場合は、呼び出しを含めます.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

あ、そう、1日か2日かな。または数千。; ^)
ルフィン

7

めったに使用されないインデクサーオーバーロードを使用したLinqプロジェクション(i)

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

私はその柔軟性のためにこの方法を好みます。

たとえば、偶数が必要な場合:

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

または、1時間ごとに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>から0変数への一連の数値()を列挙したい場合はend

Enumerable.Range(0, ++10);

説明では、0から10までの数字のシーケンスを取得するには、シーケンスを0から開始する必要があります(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)コードを削減できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.