2010-04-04 14 views
13

कोई एक विधि कैसे बना सकता है जो एक पूर्णांक i लेता है, और List<T> के सदस्य को i पर वर्तमान स्थिति से सूची के सामने तक ले जाया जाता है?सूची के एक सदस्य को सूची के सामने ले जाना

+0

आप इसे सॉर्ट करने का प्रयास कर रहे हैं, है ना? – vittore

+0

क्या मुझे ऐसा करने के लिए इसे क्रमबद्ध करने की आवश्यकता होगी? मैं सिर्फ सूची के सामने, इंडेक्स I पर एक सदस्य को स्थानांतरित करना चाहता हूं .. बाकी – Shonna

+0

को स्थानांतरित करने की आवश्यकता नहीं है, मैंने आपको एक अपवर्तित किया होगा, लेकिन आपने स्पष्ट उत्तर नहीं चुना है। क्षमा करें :( –

उत्तर

25

List<T> वर्ग इस तरह के एक विधि प्रदान नहीं करता है, लेकिन आप एक विस्तार विधि है कि आइटम हो जाता है फिर से आवेषण यह लिख सकते हैं, उसे निकाल देता है और अंत में:

static class ListExtensions 
{ 
    static void MoveItemAtIndexToFront<T>(this List<T> list, int index) 
    { 
     T item = list[index]; 
     list.RemoveAt(index); 
     list.Insert(0, item); 
    } 
} 
+0

अच्छा एक्सटेंशन – vittore

+0

विधि के लिए शीर्षलेख इस तरह माना जाना चाहिए: सार्वजनिक शून्य MoveToFront (int i) – Shonna

+15

ठीक है, क्योंकि आप हस्ताक्षर _know_ के बाद से मैं साहसपूर्वक दावा कर रहा हूं कि यह होमवर्क है। इसे टैग करें अगली बार। –

4
var l = new List<DataItem>(); 
var temp = l[index]; 
l.RemoveAt(index); 
l.Insert(0, temp); 
2

इस

प्रयास करें
static List<int> idList = new List<int>() { 1, 2, 4, 5, 6, 8, 9 }; 

    private static void moveListItem(int index) 
    { 
     int getIndex = 0; 

     foreach (int item in idList) 
     { 
      Console.WriteLine(" Before Id List Value - {0} ,Index - {1} ", item.ToString(), getIndex); 
      getIndex++; 
     } 

     int value = idList[index]; 
     idList.RemoveAt(index); 
     idList.Insert(0, value); 

     Console.WriteLine(); 

     getIndex = 0; 
     foreach (int item in idList) 
     { 
      Console.WriteLine(" After Id List Value - {0} ,Index - {1} ", item.ToString(), getIndex); 
      getIndex++; 
     } 
    } 
7

अब तक 3 उत्तरों में से कोई भी चाल है, लेकिन निकालने और एक सम्मिलित ऑपरेशन करने के बजाय, मैं सुझाव दूंगा कि प्रत्येक आइटम को वांछित स्थितियों से दाईं ओर एक स्थान पर ले जाएं, सूची की शुरुआत में। इस तरह आप आइटम के दाईं ओर स्थित वस्तुओं को स्थानांतरित करने से बचें।

यह @ डीटीबी के उत्तर का एक संशोधन है।

static class ListExtensions 
{ 
    static void MoveItemAtIndexToFront<T>(this List<T> list, int index) 
    { 
     T item = list[index]; 
     for (int i = index; i > 0; i--) 
      list[i] = list[i - 1]; 
     list[0] = item; 
    } 
} 
+0

एक विस्तार विधि के लिए, यह अधिक समझ में आएगा क्योंकि यह डीटीबी की विधि से औसत पर तेज़ है। – Groo

+0

@Groo क्या यह हमेशा बड़ी सूचियों के लिए तेज़ है? – Coops

+0

@CodeBlend: हाँ, बड़े के लिए सूचियों की सूची अधिक स्पष्ट होगी, हालांकि मैं दावा नहीं कर सकता कि आप एक नोटिस करेंगे अभ्यास में वाई अंतर। सैद्धांतिक रूप से, यह विधि और डीटीबी दोनों 'ओ (एन)' हैं, लेकिन डीटीबी के उत्तर 'सूची में। हटाएं' पहले आइटम को हटा देंगे और फिर निम्नलिखित सभी वस्तुओं को एक स्थान पीछे की ओर कॉपी करें, और फिर 'सूची। प्रविष्ट करें (0, आइटम) 'फिर से सूचकांक '0' पर आइटम डालेंगे और फिर सभी वस्तुओं को 1 स्थिति से आगे कॉपी करें। दूसरी तरफ, फेडे की विधि, केवल एक ही स्वीप करता है ('इंडेक्स' के बराबर स्वैप की संख्या)। – Groo

0

एक मरे हुए घोड़े की धड़कन का खतरा कम:

एक LinkedList इस के लिए अधिक उपयुक्त नहीं होगा? यद्यपि आप यादृच्छिक पहुंच कार्यक्षमता को खो देंगे, सूची की शुरुआत में तत्वों को सम्मिलित करना बहुत आसान होगा (.AddFirst) और बहुत अधिक कुशल।

संबंधित मुद्दे