2014-12-31 7 views
8

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

var items = new List<int> { 55, 66, 77, 88, 99 }; 
int MasterIndex = new Random().Next(0, items .Count); 

var master = items.Skip(MasterIndex).First(); 

// How to get the other items into another List<int> now? 
/* -- items.Join; 
    -- items.Select; 
    -- items.Except */ 

Join, Select, Except - उनमें से किसी को, और कैसे?

संपादित करें: मूल सूची से किसी भी आइटम को हटा नहीं सकता है, अन्यथा मुझे दो सूचियां रखना है।

उत्तर

16

उपयोग Where: -

var result = numbers.Where((v, i) => i != MasterIndex).ToList(); 

कार्य Fiddle

+0

लवली! यह बेकार ढंग से काम करता है। दस्तावेज में कहीं भी 'कह' स्पष्ट नहीं था। – Ajay

+0

@Ajay - दस्तावेज़ीकरण वहां है, 'जहां' के लिए साझा किया गया लिंक देखें, यह कहां का दूसरा अधिभार है। –

+2

हाँ। इस समय तक, मैंने पहले से ही इस उत्पाद का वास्तविक उत्पाद कोड (जो स्पष्ट रूप से चींटियों की सूची नहीं है) में उपयोग किया है। – Ajay

2

आप सूची से मास्टर आइटम को निकालने सकता है,

List<int> newList = items.RemoveAt(MasterIndex); 

RemoveAt() मूल सूची से आइटम निकाल देता है, तो यह एक नई सूची के लिए संग्रह आवंटित करने के लिए आवश्यक नहीं है। RemoveAt(), items.Contains(MasterItem) पर कॉल करने के बाद false वापस आ जाएगा।

+0

दो सूचियों की आवश्यकता है। मुझे मूल रखना होगा! – Ajay

+1

@Ajay RemoveAt() आइटम को मूल सूची से हटा देता है, इसलिए इसे एक नई सूची में असाइन करना आवश्यक नहीं है। RemoveAt() "आइटम" को कॉल करने के बाद इसमें मास्टर आइटम नहीं होगा। – Kurubaran

+1

तो, आप चाहते हैं कि मुझे डीबी, नेटवर्क, फाइल से फिर से पढ़ना चाहिए? यह उचित नहीं है। – Ajay

2

यदि प्रदर्शन एक मुद्दा है तो आप इस तरह की List.CopyTo विधि का उपयोग करना पसंद कर सकते हैं।

List<T> RemoveOneItem1<T>(List<T> list, int index) 
{ 
    var listCount = list.Count; 

    // Create an array to store the data. 
    var result = new T[listCount - 1]; 

    // Copy element before the index. 
    list.CopyTo(0, result, 0, index); 

    // Copy element after the index. 
    list.CopyTo(index + 1, result, index, listCount - 1 - index); 

    return new List<T>(result); 
} 

यह कार्यान्वयन @RahulSingh उत्तर से लगभग 3 गुना तेज है।

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