Làm thế nào để tạo một chuỗi các số nguyên trong C #?


119

F # có các chuỗi cho phép tạo chuỗi:

seq { 0 .. 10 }

Tạo dãy số từ 0 đến 10.

Có điều gì đó tương tự trong C # không?

Câu trả lời:


206

Bạn có thể sử dụng Enumerable.Range(0, 10);. Thí dụ:

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

Trang MSDN tại đây .


66
Lưu ý: Điều này tạo ra một chuỗi bắt đầu từ 0 với 10 mục (kết thúc bằng 9). Nếu bạn muốn từ 0 đến 10, tham số thứ hai sẽ là 11. Và nếu bạn cần một mảng thực tế và không IEnumerable<int>, hãy bao gồm một cuộc gọi .ToArray().
Anthony Pegram


19

Bạn có thể tạo một hàm đơn giản. Điều này sẽ làm việc cho một trình tự phức tạp hơn. Nếu không thì điều Enumerable.Rangenên làm.

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

Bởi "phức tạp hơn" có phải bạn chỉ muốn nói "nơi bạn bắt đầu và kết thúc thuận tiện thay vì số lượng phần tử"? Nếu không, tôi đang bỏ lỡ ý nghĩa của bạn. 🤔
ruffin

1
Tôi tin rằng tôi đang xem xét OddSequence EvenSequencehoặc các phạm vi tùy chỉnh khác. if (++n1 % 2 == 0) yield return n1, ví dụ. Đã được vài ngày;)
Josiah Ruddell

Ha, vâng, tôi cho là một hoặc hai ngày. Hoặc vài nghìn. ; ^)
ruffin

7

Phép chiếu Linq với quá tải trình lập chỉ mục hiếm khi được sử dụng (i) :

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

Tôi thích phương pháp này vì tính linh hoạt của nó.

Ví dụ: nếu tôi muốn evens:

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

Hoặc nếu tôi muốn gia số 5 phút của một giờ:

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

Hoặc chuỗi:

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

Tôi thực sự thích điều này nhưng nó cũng cảm thấy một chút hacky đồng thời!
Zimano

lol :-) Đó chỉ là một cách sử dụng sáng tạo tuyệt vời của quá tải trình chỉ mục!
Zimano

2

Trong C # 8.0, bạn có thể sử dụng Chỉ số và phạm vi

Ví dụ:

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

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

Hoặc nếu bạn muốn tạo IEnumerable<int>thì bạn có thể sử dụng tiện ích mở rộng:

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 Nhưng hãy cẩn thận với 'chỉ mục từ cuối' . Ví dụ, phương thức mở rộng ToEnumerable không hoạt động với var seq = ^2..^0.


1

Thực hiện của tôi:

    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

Ban đầu được trả lời ở đây .


Nếu bạn muốn liệt kê một chuỗi số ( IEnumerable<int>) từ 0một biến end, hãy thử

Enumerable.Range(0, ++10);

Theo giải thích, để có một dãy số từ 0 đến 10, bạn muốn dãy số bắt đầu từ 0 (nhớ rằng có 11 số từ 0 đến 10, bao gồm cả).


Nếu bạn muốn một chuỗi tuyến tính không giới hạn, bạn có thể viết một hàm như

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

mà bạn có thể sử dụng như thế nào

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

Nếu bạn muốn một hàm mà bạn có thể gọi nhiều lần để tạo ra các số tăng dần, có lẽ bạn muốn những thứ như vậy.

using System.Threading;

private static int orderNumber = 0;

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

Khi bạn gọi Seq()nó sẽ trả về số thứ tự tiếp theo và tăng bộ đếm.


0

Tôi có các chức năng này trong mã của mình

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ều này giúp giảm một số cho (i) mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.