मैं सूची <T> के माध्यम से कैसे लूप कर सकता हूं और प्रत्येक आइटम को पकड़ सकता हूं?


176

मैं एक सूची के माध्यम से कैसे लूप कर सकता हूं और प्रत्येक आइटम को पकड़ सकता हूं?

मैं चाहता हूं कि आउटपुट इस तरह दिखे:

Console.WriteLine("amount is {0}, and type is {1}", myMoney.amount, myMoney.type);

यहाँ मेरा कोड है:

static void Main(string[] args)
{
    List<Money> myMoney = new List<Money> 
    {
        new Money{amount = 10, type = "US"},
        new Money{amount = 20, type = "US"}
    };
}

class Money
{
    public int amount { get; set; }
    public string type { get; set; }
}

जवाबों:


274

foreach:

foreach (var money in myMoney) {
    Console.WriteLine("Amount is {0} and type is {1}", money.amount, money.type);
}

MSDN लिंक

वैकल्पिक रूप से, क्योंकि यह एक है List<T>.. जो एक अनुक्रमणिका विधि को लागू करता है [], आप एक सामान्य forलूप का भी उपयोग कर सकते हैं .. हालांकि इसकी कम पठनीयता (IMO):

for (var i = 0; i < myMoney.Count; i++) {
    Console.WriteLine("Amount is {0} and type is {1}", myMoney[i].amount, myMoney[i].type);
}

7
@awudoin क्या? नहीं, यह नहीं है .. यह स्टैक पर एक संदर्भ बनाता है .. इसके अलावा, यह नहीं है। ए foreachवस्तुओं को क्लोन नहीं करता है ..
साइमन व्हाइटहेड

2
मुझे स्पष्ट करना चाहिए: यह भी एक बनाता है Enumerator.. जो कि एक है struct.. जो स्टैक पर भी है। इसलिए मुझे अभी भी काफी कुछ नहीं मिल रहा है जो आपको आपकी टिप्पणी के साथ मिल रहा है।
साइमन व्हाइटहेड

7
आप सही कह रहे हैं .... यह सिर्फ एक Enumeratorऔर वस्तु की नकल नहीं है। लेकिन तथ्य यह है कि आप जो कर रहे हैं उसके आधार पर एक foreachलूप बनाम लूप के साथ अधिक ओवरहेड है for। मैंने आपके कोड में 100,000 प्रविष्टियों के साथ एक त्वरित परीक्षण चलाया Listऔर foreachलूप दो बार लंबे समय तक ले गया (वास्तव में 1.9 गुना लंबा)। यह जरूरी नहीं कि सभी स्थितियों में सही हो, लेकिन बहुतों में। यह सूची के आकार पर निर्भर करता है कि आप लूप के भीतर कितने ऑपरेशन करते हैं, आदि .... यह वही था जो मुझे मिल रहा था।
awudoin

36

पूर्णता के लिए, वहाँ LINQ / लैम्बडा तरीका भी है:

myMoney.ForEach((theMoney) => Console.WriteLine("amount is {0}, and type is {1}", theMoney.amount, theMoney.type));

20

किसी भी अन्य संग्रह की तरह। List<T>.ForEachविधि के अलावा के साथ ।

foreach (var item in myMoney)
    Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type);

for (int i = 0; i < myMoney.Count; i++)
    Console.WriteLine("amount is {0}, and type is {1}", myMoney[i].amount, myMoney[i].type);

myMoney.ForEach(item => Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type));

6
चेतावनी का एक और शब्द, यदि आपके पास एक बड़ी सूची है, (बड़े से मेरा मतलब 100,000 से अधिक वस्तुओं से है) myMoney.Count थोड़ी देर के लिए शुरू होती है क्योंकि उसे गणना करने के लिए सूची को पार करना पड़ता है, और उदाहरण के लिए myMoney के ऊपर। हर बार लूप के चारों ओर गिनती की जाती है। इसलिए int myMoneyC = myMoney.Count का उपयोग करना; for (int i = 0; i <myMoneyC; i ++) इस लूप को कई गुना तेज कर देगा।
SuperGSJ

12

यह है कि मैं और अधिक का उपयोग करके कैसे लिखूंगा functional way। यहाँ कोड है:

new List<Money>()
{
     new Money() { Amount = 10, Type = "US"},
     new Money() { Amount = 20, Type = "US"}
}
.ForEach(money =>
{
    Console.WriteLine($"amount is {money.Amount}, and type is {money.Type}");
});

2
धन्यवाद। यह इस कार्य को प्राप्त करने का बहुत छोटा तरीका है। आपने राइटलाइन 2017 / .NET 4.7 में पेश की गई राइटलाइन के नए और कॉम्पैक्ट सिंटैक्स का भी उपयोग किया है।
दीप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.