सूची <टी> प्रविष्टि आदेश की गारंटी देता है?


238

मान लें कि मेरे पास एक सूची में 3 तार हैं (उदाहरण के लिए "1", "2", "3")।

फिर मैं उन्हें स्थिति 1 में "2" स्थान देना चाहता हूं (उदाहरण के लिए "2", "1", "3")।

मैं इस कोड का उपयोग कर रहा हूं (indexToMoveTo से 1 तक सेटिंग):

listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);

यह काम करने लगता है, लेकिन मुझे कभी-कभी अजीब परिणाम मिलते हैं; कभी-कभी आदेश गलत है या सूची से आइटम हटाए जा रहे हैं!

कोई विचार? क्या List<T>गारंटी देता है आदेश?

सम्बंधित:

क्या एक सूची <T> गारंटी देता है कि आइटम उस क्रम में वापस आ जाएंगे जो उन्हें जोड़ा गया था?


3
यह यहाँ वर्णित के रूप में सच नहीं है: stackoverflow.com/a/1790318/696517
jrmgx

जवाबों:


311

List<>वर्ग गारंटी आदेश है - बातें, उन्हें जोड़ने पर आदेश डुप्लिकेट सहित सूची में रख लिया जाएगा जब तक आप स्पष्ट सूची को क्रमबद्ध करें।

MSDN के अनुसार:

... सूची "उन वस्तुओं की दृढ़ता से टाइप की गई सूची का प्रतिनिधित्व करता है जिन्हें सूचकांक द्वारा एक्सेस किया जा सकता है ।"

सही होने के लिए सूचकांक मूल्यों को विश्वसनीय रहना चाहिए। इसलिए आदेश की गारंटी है।

यदि आप सूची में बाद में आइटम ले जा रहे हैं, तो आपको अपने कोड से विषम परिणाम प्राप्त हो सकते हैं, क्योंकि Remove()कॉल करने से पहले आपके सभी आइटम एक स्थान से नीचे चले जाएंगे Insert()

क्या आप अपने कोड को पोस्ट करने के लिए काफी छोटा कर सकते हैं?


63
किसी भी भविष्य के googler के लिए यहाँ सूची (टी) के लिए MSDN (मेरा खदान) से सटीक उद्धरण है। सूची <T> के अंत में जोड़ा जाने वाला ऑब्जेक्ट जोड़ें । संदर्भ प्रकारों के लिए मान शून्य हो सकता है।
एल्सज़ोवका

4
क्या इस बारे में Microsoft या C # विनिर्देशन से हमें कोई अधिक निश्चित उद्धरण / संदर्भ मिल सकता है? @ aolszowka के उद्धरण से निश्चित रूप से यह प्रतीत होता है कि यह सम्मिलन क्रम को बनाए रखता है, लेकिन तकनीकी रूप से सूची किसी आइटम को जोड़ने के बाद किसी भी समय संग्रह को फिर से ऑर्डर कर सकती है और यह कथन अभी भी मान्य होगा। मैं इसके बारे में नाइट-पिकी प्राप्त नहीं करना चाहता, लेकिन अगर एक प्रबंधक या क्यूए ने वास्तव में मुझे इस स्थिति का बचाव किया है, तो मैं उस बोली के साथ बहुत आत्मविश्वास महसूस नहीं करूंगा।
तेहदोर

4
मैं कुछ पुष्टिकरण प्राप्त करने के लिए दो उपयोगी तरीकों के बारे में सोच सकता हूं। सबसे पहले, स्रोत पढ़ें और खुद को संतुष्ट करें। दूसरे, Listकिसी भी अच्छे कंप्यूटर विज्ञान की पाठ्यपुस्तक में सार डेटा प्रकार की परिभाषा देखें । वैसे ही जैसे Queueऔर Stack, एक Listएक अच्छी तरह से परिभाषित, उम्मीद के मुताबिक है और अच्छी तरह से समझ डेटा संरचना है - अगर नेट कार्यान्वयन मतभेद (या यदि वह परिवर्तित) एक बहुत सॉफ्टवेयर के टूट जाएगा।
बेवन

@tehDorf मेरा इस पर लेना (यदि इस पर कोई चर्चा होनी थी) है: "यदि ऑर्डर करने से आपकी पद्धति / एल्गोरिदम का संचालन प्रभावित होता है, तो आपको स्पष्ट रूप से सूची का आदेश देना चाहिए या आपका एपीआई उपयुक्त इंटरफ़ेस / वर्ग जैसे IOrdernEnumerable या लेना चाहिए SortedList, अन्यथा आपको एक विशेष तरीके से व्यवहार करने के लिए किसी विशेष कार्यान्वयन पर भरोसा नहीं करना चाहिए जब तक कि यह स्पष्ट रूप से स्पष्ट रूप से नहीं कहा गया है "आपको सूची के स्पष्ट रूप से सूची <T> के बारे में सावधान रहना होगा क्योंकि उनका कार्यान्वयन अस्थिर प्रकार का उपयोग करता है।
एल्सज़ोवका

1
@achuthakrishnan वे अलग-अलग मुद्दे हैं। सूची की गारंटी देता है कि आइटम को उस सूची में जोड़े रखने के क्रम में रखा गया है। जब आप Where()सूची को फ़िल्टर करने के लिए LINQ पद्धति का उपयोग करते हैं , तो आप क्रम में आइटम पर विचार करने के लिए कार्यान्वयन पर निर्भर होते हैं। ऐसा होता है कि यह करता है (देखें referenceource.microsoft.com/System.Core/System/Linq/… ), लेकिन यह MSDN में प्रलेखित नहीं है। मैं सुझाव देता हूं कि emp.LastOrDefault(x => x.empDept = 'abc')यह प्रलेखन के रूप में उपयोग करना LastOrDefault()दर्शाता है कि यह वस्तुओं के क्रम को बनाए रखता है।
बेवन

36

यहाँ 4 आइटम हैं, उनके सूचकांक के साथ

0  1  2  3
K  C  A  E

आप K को A और E के बीच ले जाना चाहते हैं - आप सोच सकते हैं कि स्थिति 3. आप यहाँ अपनी अनुक्रमणिका के बारे में सावधान रहें, क्योंकि हटाने के बाद, सभी अनुक्रमणिकाएँ अद्यतन हो जाती हैं।

तो आप आइटम 0 को हटा दें, पहले

0  1  2
C  A  E

फिर आप 3 पर डालें

0  1  2  3
C  A  E  K

सही परिणाम प्राप्त करने के लिए, आपको सूचकांक 2 का उपयोग करना चाहिए। चीजों को सुसंगत बनाने के लिए, आपको (indexToMoveTo-1) को भेजना होगा if indexToMoveTo > indexToMove, जैसे

bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);

यह आपकी समस्या से संबंधित हो सकता है। ध्यान दें मेरा कोड अप्राप्त है!

संपादित करें : वैकल्पिक रूप से, यदि आप अपनी स्थिति पर लागू होते हैं , तो आप Sortएक कस्टम तुलना ( IComparer) के साथ कर सकते हैं ।


बेवन की प्रतिक्रिया को पर्याप्त रूप से नहीं पढ़ा, मैंने अभी उस जमीन को कवर किया है।
जोएल गुडविन

9
हाँ, लेकिन आपने विस्तार से और बेवन के उत्तर के साथ-साथ कुछ समाधान कोड का उदाहरण दिया है, इसलिए आपका उत्तर टोटोलोगस नहीं है और मैंने आपको वोट दिया है।
जेसन एस

9

जैसा कि बेवन ने कहा, लेकिन ध्यान रखें, कि सूची-सूचकांक 0-आधारित है। यदि आप सूची के सामने एक तत्व को स्थानांतरित करना चाहते हैं, तो आपको इसे इंडेक्स 0 (आपके उदाहरण में दिखाए गए अनुसार 1 नहीं) में सम्मिलित करना होगा।


1

यह वह कोड है जो मेरे पास एक सूची में किसी स्थान को नीचे ले जाने के लिए है:

if (this.folderImages.SelectedIndex > -1 && this.folderImages.SelectedIndex < this.folderImages.Items.Count - 1)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index + 1, imageName);
    this.folderImages.SelectedIndex = index + 1;
 }

और इसे एक जगह ऊपर ले जाने के लिए:

if (this.folderImages.SelectedIndex > 0)
{
    string imageName = this.folderImages.SelectedItem as string;
    int index = this.folderImages.SelectedIndex;

    this.folderImages.Items.RemoveAt(index);
    this.folderImages.Items.Insert(index - 1, imageName);
    this.folderImages.SelectedIndex = index - 1;
}

folderImagesएक है ListBoxतो बेशक सूची एक है ListBox.ObjectCollection, नहीं एक List<T>है, लेकिन यह से विरासत है IListतो यह एक ही व्यवहार करना चाहिए। क्या यह मदद करता है?

बेशक पूर्व केवल तभी काम करता है यदि चयनित आइटम सूची में अंतिम आइटम नहीं है और बाद वाला यदि चयनित आइटम पहला आइटम नहीं है।


1

यदि आप संचालन के क्रम को बदल देंगे, तो आप अजीब व्यवहार से बचेंगे: पहले मूल्य को सूची में सही जगह पर डालें, और फिर उसे अपनी पहली स्थिति से हटा दें। सुनिश्चित करें कि आप इसे उसके सूचकांक से हटा दें, क्योंकि यदि आप इसे संदर्भ द्वारा हटा देंगे, तो आप उन दोनों को हटा सकते हैं ...

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