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 पर समाप्त) के साथ एक अनुक्रम बनाता है। यदि आप 10 के माध्यम से 0 चाहते हैं , तो दूसरा पैरामीटर 11. होगा और अगर आपको वास्तविक सरणी की आवश्यकता है और नहीं IEnumerable<int>, तो कॉल शामिल करें .ToArray()
एंथनी पेगम


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, उदाहरण के लिए। कुछ ही दिन हुए हैं;)
जोशियाह रूडेल

हा, हाँ, एक या दो दिन मुझे लगता है। या कुछ हज़ार। ; ^)
रफिन

7

शायद ही कभी अनुक्रमित अधिभार (i) के साथ Linq प्रक्षेपण :

(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

योग्य :-) यह इंडेक्सर अधिभार का सिर्फ एक महान रचनात्मक उपयोग है!
ज़िमानो

2

C # 8.0 में आप Indices और पर्वतमाला का उपयोग कर सकते हैं

उदाहरण के लिए:

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

पुनश्च लेकिन 'अंत से अनुक्रमित' के साथ सावधान रहें । उदाहरण के लिए, 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>से संख्याओं ( ) का अनुक्रम दोहराना चाहते हैं , तो प्रयास करें0end

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

यह (i) कोड के लिए कुछ कम करने में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.