किस क्रम में प्रत्येक लूप के लिए एक C # सूची <T> से अधिक होता है?


84

मैं इस आदेश के बारे में सोच रहा था कि एक System.Collections.Generic.List<T>वस्तु के माध्यम से सी # लूप में एक फॉरेक्स लूप ।

मुझे उसी विषय के बारे में एक और सवाल मिला , लेकिन मुझे नहीं लगता कि यह मेरे संतोष के सवाल का जवाब देता है।

कोई कहता है कि कोई आदेश परिभाषित नहीं है। लेकिन जैसा कि कोई और बताता है, यह जिस क्रम का पता लगाता है वह निश्चित है (0 से लंबाई -1 तक)। 8.8.4 फॉर्च्यूमेंट स्टेटमेंट

यह भी कहा गया कि एक आदेश के साथ किसी भी मानक वर्गों के लिए समान है (जैसे List<T>)। मुझे लगता है कि वापस करने के लिए कोई दस्तावेज नहीं मिल सकता है। तो सभी के लिए मुझे पता है कि यह अब की तरह काम कर सकता है, लेकिन शायद अगले .NET संस्करण में यह अलग होगा (भले ही यह संभावना नहीं हो सकता है)।

मैंने List(t).Enumeratorबिना भाग्य के प्रलेखन को भी देखा है ।

एक अन्य संबंधित प्रश्न में कहा गया है कि जावा के लिए, यह विशेष रूप से प्रलेखन में उल्लिखित है:

List.iterator()इस सूची में तत्वों पर उचित क्रम में एक पुनरावृत्ति देता है। "

मैं सी # प्रलेखन में ऐसा कुछ खोज रहा हूं।

अग्रिम में धन्यवाद।

संपादित करें: आप सभी के जवाबों के लिए आप सभी के लिए धन्यवाद (कमाल है कि मुझे कितने उत्तर मिले)। सभी उत्तरों से मुझे जो समझ में आता है वह List<T>यह है कि हमेशा इसके अनुक्रमण के क्रम में पुनरावृति होती है। लेकिन मैं अभी भी यह बताते हुए दस्तावेज़ीकरण की एक स्पष्ट शांति देखना चाहूंगा, जावा प्रलेखन केList समान ।

जवाबों:


14

पर माइक्रोसॉफ्ट संदर्भ स्रोत पेज के लिए List<T>गणनाकार यह स्पष्ट रूप से कहा गया है कि यात्रा 0 से लंबाई -1 करने के लिए किया जाता है:

internal Enumerator(List<T> list) {
    this.list = list;
    index = 0;
    version = list._version;
    current = default(T);
}

public bool MoveNext() {

    List<T> localList = list;

    if (version == localList._version && ((uint)index < (uint)localList._size)) 
    {                                                     
        current = localList._items[index];                    
        index++;
        return true;
    }
    return MoveNextRare();
}

आशा है कि यह अभी भी किसी के लिए प्रासंगिक है


102

मूल रूप से यह पर निर्भर है IEnumeratorकार्यान्वयन - लेकिन एक के लिए List<T>यह हमेशा सूची के प्राकृतिक व्यवस्था, यानी इंडेक्सर के रूप में एक ही क्रम में जाना होगा: list[0], list[1], list[2]आदि

मेरा मानना ​​है कि यह स्पष्ट रूप से प्रलेखित है - कम से कम, मुझे ऐसा कोई दस्तावेज नहीं मिला है - लेकिन मुझे लगता है कि आप इसे गारंटी के रूप में मान सकते हैं। उस आदेश में कोई भी परिवर्तन सभी प्रकार के कोड को अनावश्यक रूप से तोड़ देगा। वास्तव में, मुझे यह देखकर कोई आश्चर्य IList<T>नहीं होगा कि इसका किसने क्रियान्वयन किया । यह विशेष रूप से प्रलेखित देखकर अच्छा लगेगा ...


मैंने सचमुच 5 सेकंड पहले एक उत्तर के लिए जाँच की, और कुछ इसी तरह की पोस्ट करने वाला था। आप बहुत तेज हैं!
माइकल जी

आपके उत्तर के लिए धन्यवाद। क्या कुछ दस्तावेज हैं जो इसकी गारंटी देते हैं?
14th पर Matthijs वेसल्स

1
@ मिचेल जी: मैं प्रलेखन के रूप में MSDN उदाहरण कोड पर भरोसा नहीं करता। मैंने इसमें कई भयावह त्रुटियां देखी हैं।
जॉन स्कीट

1
किसी को भी सरणी के बारे में एक ही जवाब प्रदान कर सकते हैं?
यज्ञप्रो

12
@yazanpro: foreachनिश्चित रूप से एक सरणी के साथ क्रमबद्ध होगा।
जॉन स्कीट

8

आपके लिंक में, सी # भाषा विशिष्टता संस्करण 3.0, पृष्ठ 240 में स्वीकृत उत्तर बताता है :

वह क्रम जिसमें फॉरेक्स आरेख के तत्वों का पता लगाता है, इस प्रकार है: एकल-आयामी सरणियों के लिए तत्वों को अनुक्रमणिका क्रम में बढ़ते हुए, सूचकांक 0 से शुरू किया जाता है और सूचकांक की लंबाई के साथ समाप्त किया जाता है - 1. बहुआयामी सरणियों के लिए, तत्वों का पता लगाया जाता है। ऐसा है कि सबसे दाएं आयाम के सूचकांकों को पहले बढ़ाया जाता है, फिर अगले बाएं आयाम, और इसी तरह बाईं ओर। निम्नलिखित उदाहरण तत्व मूल्य में दो-आयामी सरणी में प्रत्येक मूल्य को प्रिंट करता है:

using System;
class Test
{
  static void Main() {
      double[,] values = {
          {1.2, 2.3, 3.4, 4.5},
          {5.6, 6.7, 7.8, 8.9}
      };
      foreach (double elementValue in values)
          Console.Write("{0} ", elementValue);
      Console.WriteLine();
  }
}

उत्पादित उत्पादन निम्नानुसार है: 1.2 2.3 3.4 4.5 4.5 6.7 6.7 7.8 8.9 उदाहरण में

int[] numbers = { 1, 3, 5, 7, 9 };
foreach (var n in numbers) Console.WriteLine(n);
the type of n is inferred to be int, the element type of numbers.

2
हां, लेकिन यह एक सरणी के लिए है। क्या यह स्वचालित रूप से सूची <T> वर्ग के लिए है?
मथिज्स वेसल्स

2
सूची <टी> अपने बैकिंग स्टोर के लिए एक सरणी का उपयोग करता है। तो हाँ।
जोएल मुलर

9
लेकिन यह एक कार्यान्वयन विवरण है। सूची <T> को इसके बैकिंग स्टोर के रूप में एक सरणी का उपयोग करने की आवश्यकता नहीं है ।
एरिक लिपर्ट

3
मैं सूची <T> के लिए प्रलेखन को इंगित करना चाहूंगा (उदाहरण कोड के अनुसार): "सूची <(<(T>)>) वर्ग ArrayList वर्ग के सामान्य समतुल्य है। यह IList <() को लागू करता है। <(T>)>) जेनेरिक इंटरफ़ेस एक सरणी का उपयोग कर रहा है जिसका आकार गतिशील रूप से आवश्यकतानुसार बढ़ा है। " (जोर मेरा)
RCIX 425

हम्म, मुझे लगता है कि यह हमेशा एक सरणी का उपयोग करता है। लेकिन फिर भी, क्या इसका मतलब यह है कि यह उलटा एन्यूमरेटर वापस नहीं कर सकता है?
Matthijs वेसल्स

4

ऑर्डर को फ़ोरम लूप का उपयोग करके डेटा के संग्रह को पार करने के लिए उपयोग किए जा रहे पुनरावृत्त द्वारा परिभाषित किया गया है।

यदि आप एक मानक संग्रह का उपयोग कर रहे हैं जो कि इंडेक्सेबल (जैसे कि एक सूची) है, तो यह इंडेक्स 0 से शुरू होने वाले संग्रह को आगे बढ़ाएगा और आगे बढ़ेगा।

यदि आपको आदेश को नियंत्रित करने की आवश्यकता है तो आप या तो नियंत्रित कर सकते हैं कि संग्रह का पुनरावृत्ति कैसे अपने स्वयं के IEnumerable को लागू करके नियंत्रित किया जाता है , या आप उस सूची को सॉर्ट कर सकते हैं जिस तरह से आप चाहते हैं कि फ़ॉरच लूप को निष्पादित करने से पहले।

यह बताता है कि Enumerator जेनेरिक सूची के लिए कैसे काम करता है। सबसे पहले वर्तमान तत्व अपरिभाषित है और अगले आइटम पर जाने के लिए MoveNext का उपयोग करता है।

यदि आप MoveNext पढ़ते हैं तो यह इंगित करता है कि यह संग्रह के पहले तत्व के साथ शुरू होगा और वहाँ से अगले एक तक चलेगा जब तक कि यह संग्रह के अंत तक न पहुँच जाए।


उत्तर और जोड़ के लिए धन्यवाद (हर कोई इतनी तेजी से जवाब दे रहा है, मैं मुश्किल से रख सकता हूं)। मैंने वो भी पढ़ लिया। शायद मैं किसी ऐसे व्यक्ति को निर्दिष्ट करने के लिए एक <शब्द हो रहा हूं जो बहुत सटीक होना चाहता है>, लेकिन मुझे लगता है कि जब वे "पहला तत्व" कहते हैं, तो उनका मतलब है कि पहला तत्व जो पुनरावृत्त होने वाला है, वह तत्व जो पहले के अनुसार नहीं है पुनरावृत्त वर्ग के आदेश के लिए।
मथिज्स वेसल्स

अगर यह महत्वपूर्ण है कि आप निश्चित हैं कि यह जिस तरह से आप उम्मीद करते हैं, तो सबसे अच्छा तरीका यह है कि मैंने जो कहा वह किया और खुद को IEnumerable लागू किया।
ब्रेंडन एनरिक

1

सूचियाँ आइटमों को एक क्रम में वापस करने के लिए लगती हैं जो वे बैकिंग स्टोर में हैं - इसलिए यदि उन्हें उस सूची में जोड़ा जाता है जिस तरह से उन्हें उस तरह से लौटाया जाएगा।

यदि आपका कार्यक्रम आदेश देने पर निर्भर करता है, तो आप सूची को ट्रेस करने से पहले उसे क्रमबद्ध करना चाह सकते हैं।

यह रैखिक खोजों के लिए कुछ हद तक मूर्खतापूर्ण है - लेकिन अगर आपको आदेश की आवश्यकता है तो एक निश्चित तरीका है कि आपकी सबसे अच्छी शर्त उस क्रम में आइटम बनाती है।


1

मुझे कोड के त्वरित हैक के समान कुछ करना है, हालांकि यह मेरे लिए सूची को फिर से करने के लिए जो मैं करने की कोशिश कर रहा था उसके लिए काम नहीं किया।

ऑर्डर बदलने के लिए LINQ का उपयोग करना

         DataGridViewColumn[] gridColumns = new DataGridViewColumn[dataGridView1.Columns.Count];
         dataGridView1.Columns.CopyTo(gridColumns, 0); //This created a list of columns

         gridColumns = (from n in gridColumns
                        orderby n.DisplayIndex descending
                        select n).ToArray(); //This then changed the order based on the displayindex

मैं यह नहीं देखता कि यह सवाल कैसे संबंधित है। आपका कोड भी उपयोग नहीं करता है List। मुझे लगता है कि आपने "सूची" के साथ मेरा मतलब गलत समझा।
Matthijs वेसल्स

इसके अलावा, तुम क्यों की सामग्री कॉपी करते हैं Columnsकरने के लिए gridColumnsपहले? मुझे लगता है कि आप भी बस कर सकते हैं:DataGridViewColumn[] gridColumns = dataGridView1.Columns.OrderByDescending(n => n.DisplayIndex).ToArray();
Matthijs वेसल्स

@MatthijsWessels यदि आप चाहते हैं कि सूची का उपयोग करने के लिए इसे बदलना मुश्किल नहीं होगा।
ऑस्टिन हेनले

@AustinHenley आप IOrderedEnumerable पर फ़ॉरच कर सकते हैं, लेकिन यह वह सवाल नहीं है जो इसके बारे में है। आप ToArray के बजाय ToList भी कर सकते थे, लेकिन तब आपके पास बस एक सूची फिर से होगी और यह प्रश्न कि क्या एक फ़ॉरवर्ड तब निर्दिष्ट क्रम में आइटम पर लूप करेगा अभी भी अनुत्तरित है।
Matthijs वेसल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.