Bagaimana cara membuat urutan bilangan bulat di C #?

119

F # memiliki urutan yang memungkinkan untuk membuat urutan:

seq { 0 .. 10 }

Buat urutan angka dari 0 hingga 10.

Apakah ada yang serupa di C #?

Budda
sumber

Jawaban:

206

Anda bisa menggunakan Enumerable.Range(0, 10);. Contoh:

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

Halaman MSDN di sini .

alexn
sumber
66
Catatan: Ini membuat urutan mulai dari 0 dengan 10 item (berakhir pada 9). Jika Anda menginginkan 0 hingga 10, parameter kedua adalah 11. Dan jika Anda membutuhkan array aktual dan tidak IEnumerable<int>, sertakan panggilan .ToArray().
Anthony Pegram
19

Anda bisa membuat fungsi sederhana. Ini akan bekerja untuk urutan yang lebih rumit. Jika tidak, yang Enumerable.Rangeseharusnya dilakukan.

IEnumerable<int> Sequence(int n1, int n2)
{
    while (n1 <= n2)
    {
        yield return  n1++;
    }
}
Josiah Ruddell
sumber
Yang Anda maksud dengan "lebih rumit" adalah "di mana Anda memiliki awal dan akhir yang berguna alih-alih jumlah elemen"? Kalau tidak, aku kehilangan maksudmu. 🤔
ruffin
1
Saya yakin saya sedang mempertimbangkan OddSequence EvenSequenceatau rentang khusus lainnya. if (++n1 % 2 == 0) yield return n1, sebagai contoh. Sudah beberapa hari;)
Josiah Ruddell
Ha, ya, satu atau dua hari kurasa. Atau beberapa ribu. ; ^)
ruffin
7

Proyeksi Linq dengan overload pengindeks yang jarang digunakan (i) :

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

Saya lebih suka metode ini karena fleksibilitasnya.

Misalnya, jika saya ingin genap:

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

Atau jika saya ingin kenaikan 5 menit dalam satu jam:

(new int[12]).Select((item,i) => i*5)

Atau string:

(new int[12]).Select((item,i) => "Minute:" + i*5)
b_levitt
sumber
Saya sangat suka ini tetapi juga terasa sedikit hack pada saat yang sama!
Zimano
lol :-) Ini hanya penggunaan kreatif dari kelebihan beban pengindeks!
Zimano
2

Di C # 8.0 Anda dapat menggunakan Indeks dan rentang

Sebagai contoh:

var seq = 0..2;
var array = new string[]
{
    "First",
    "Second",
    "Third",
};

foreach(var s in array[seq])
{
    System.Console.WriteLine(s);
}
// Output: First, Second

Atau jika Anda ingin membuat IEnumerable<int>maka Anda dapat menggunakan extension:

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 Tapi hati-hati dengan 'indeks dari akhir' . Misalnya, metode ekstensi ToEnumerable tidak berfungsi var seq = ^2..^0.

Evgeniy Mironov
sumber
1

Implementasi saya:

    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;
        }
    }
Dicaste
sumber
0

Awalnya dijawab di sini .


Jika Anda ingin menghitung urutan angka ( IEnumerable<int>) dari 0variabel end, cobalah

Enumerable.Range(0, ++10);

Dalam penjelasannya, untuk mendapatkan urutan angka dari 0 sampai 10, Anda ingin urutannya dimulai dari 0 (ingat bahwa ada 11 angka antara 0 dan 10, inklusif).


Jika Anda menginginkan rangkaian linier tak terbatas, Anda dapat menulis fungsi seperti

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

yang bisa Anda gunakan seperti

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

Jika Anda menginginkan suatu fungsi yang dapat Anda panggil berulang kali untuk menghasilkan angka yang bertambah, mungkin Anda menginginkan sesuatu seperti itu.

using System.Threading;

private static int orderNumber = 0;

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

Ketika Anda memanggilnya, Seq()itu akan mengembalikan nomor pesanan berikutnya dan menambah konter.

Jodrell
sumber
0

Saya memiliki fungsi-fungsi ini dalam kode saya

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

Ini membantu mengurangi beberapa untuk (i) kode.

haiduong87
sumber