C # 'da bir tamsayı dizisi nasıl oluşturulur?


119

F # dizileri oluşturmaya izin veren dizilere sahiptir:

seq { 0 .. 10 }

0'dan 10'a kadar sayı dizisi oluşturun.

C # 'da benzer bir şey var mı?

Yanıtlar:


206

Kullanabilirsiniz Enumerable.Range(0, 10);. Misal:

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

MSDN sayfası burada .


66
Not: Bu, 0'dan 10 maddeyle başlayan (9 ile biten) bir sıra oluşturur. Eğer 0 istiyorsanız aracılığıyla 10, ikinci parametre 11. olurdu Ve gerçek bir dizi değil gerekirse IEnumerable<int>, bir mesaj eklemesi .ToArray().
Anthony Pegram


19

Basit bir işlev oluşturabilirsiniz. Bu daha karmaşık bir sekans için işe yarar. Aksi takdirde Enumerable.Rangeyapmalı.

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

"Daha karmaşık" derken, "öğelerin sayısı yerine kullanışlı başlayıp nerede bitirdiğiniz" mi demek istiyorsunuz? Aksi takdirde anlamını kaçırırım. 🤔
ruffin

1
Sanırım OddSequence EvenSequenceya da diğer özel aralıkları düşünüyordum. if (++n1 % 2 == 0) yield return n1, Örneğin. Birkaç gün oldu;)
Josiah Ruddell

Ha, evet, sanırım bir iki gün. Veya birkaç bin. ; ^)
ruffin

7

Nadiren kullanılan aşırı indeksleyici (i) ile Linq projeksiyonu :

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

Bu yöntemi esnekliği için tercih ediyorum.

Örneğin, çiftler istiyorsam:

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

Veya bir saatlik 5 dakikalık artışlar istersem:

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

Veya dizeler:

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

Bunu gerçekten beğendim ama aynı zamanda biraz huysuz da hissediyor!
Zimano

lol :-) İndeksleyici aşırı yüklemesinin harika bir yaratıcı kullanımı!
Zimano

2

C # 8.0'da Endeksleri ve aralıkları kullanabilirsiniz

Örneğin:

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

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

Veya oluşturmak IEnumerable<int>istiyorsanız, uzantıyı kullanabilirsiniz:

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

Not: Ancak 'sondan indekslere' dikkat edin . Örneğin, ToEnumerable genişletme yöntemi ile çalışmıyor var seq = ^2..^0.


1

Uygulamam:

    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

Aslen burada cevaplandı .


Bir değişkenten bir sayı dizisini ( IEnumerable<int>) numaralandırmak istiyorsanız , şunu deneyin:0end

Enumerable.Range(0, ++10);

Açıklamada, 0'dan 10'a kadar bir sayı dizisi elde etmek için, dizinin 0'dan başlamasını istersiniz (0 ile 10 arasında 11 sayı olduğunu hatırlayarak).


Sınırsız bir doğrusal dizi istiyorsanız, şöyle bir işlev yazabilirsiniz:

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

hangi gibi kullanabilirsin

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

Bir işlev istiyorsanız, artan numaralar oluşturmak için tekrar tekrar arayabilirsiniz, belki de buna benzer bir şey istiyorsunuz.

using System.Threading;

private static int orderNumber = 0;

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

Aradığınızda Seq(), bir sonraki sipariş numarasını döndürür ve sayacı artırır.


0

Kodumda bu işlevler var

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

Bu, (i) kodunun bir kısmını azaltmaya yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.