จะสร้างลำดับของจำนวนเต็มใน 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 พารามิเตอร์ที่สองจะเป็น 11 และถ้าคุณต้องการอาร์เรย์ที่เกิดขึ้นจริงและไม่รวมถึงการโทรIEnumerable<int> .ToArray()
Anthony Pegram


19

คุณสามารถสร้างฟังก์ชันง่ายๆ สิ่งนี้จะใช้ได้กับลำดับที่ซับซ้อนมากขึ้น มิฉะนั้นEnumerable.Rangeควรทำ

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

โดย "ซับซ้อนมากขึ้น" คุณหมายถึงเพียงแค่ "จุดที่คุณเริ่มต้นและสิ้นสุดสะดวกแทนที่จะเป็นจำนวนองค์ประกอบ" หรือไม่ ไม่อย่างนั้นฉันจะขาดความหมายของคุณ 🤔
ruffin

1
ฉันเชื่อว่าฉันกำลังพิจารณาOddSequence EvenSequenceหรือช่วงที่กำหนดเองอื่น ๆ if (++n1 % 2 == 0) yield return n1, ตัวอย่างเช่น. ไม่กี่วันแล้ว;)
Josiah Ruddell

1
ฮ่าใช่ฉันคิดว่าหนึ่งหรือสองวัน หรือไม่กี่พัน. ; ^)
ruffin

7

การฉายภาพ Linq ด้วยการโอเวอร์โหลดตัวทำดัชนีที่ไม่ค่อยใช้(i) :

(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)

ฉันชอบสิ่งนี้มาก แต่ก็รู้สึกแฮ็คนิดหน่อยในเวลาเดียวกัน!
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

ปล. แต่ระวัง'indexes from end'ด้วย ตัวอย่างเช่นวิธีขยาย 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 (โปรดจำไว้ว่ามี 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()มันจะส่งคืนหมายเลขคำสั่งซื้อถัดไปและเพิ่มตัวนับ


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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.