2008-09-02 14 views
10

मैं मैं (एक नई सरणी में तत्वों को कॉपी मैं एक लाइव दृश्य की जरूरत के बिना इस ReadOnlyCollection<> का एक हिस्सा कैसे पारित कर सकते हैंमैं केवल IList <> के एक टुकड़े का पर्दाफाश कैसे कर सकता हूं?

System.Collections.ObjectModel.ReadOnlyCollection<> 

के माध्यम से एक वर्ग संपत्ति एक आंतरिक IList <> उजागर है, और लक्ष्य डिवाइस कम है स्मृति पर)? मैं कॉम्पैक्ट फ्रेमवर्क 2.0 को लक्षित कर रहा हूं।

उत्तर

14

एक विधि है कि एक गणन उपज का उपयोग कर रिटर्न का प्रयास करें:

IEnumerable<T> FilterCollection<T>(ReadOnlyCollection<T> input) { 
    foreach (T item in input) 
     if ( /* criterion is met */) 
      yield return item; 
} 
1

आप हमेशा एक कक्षा लिख ​​सकते हैं जो इंडिज़ का अनुवाद करने के बाद मूल सूची में सभी कॉल को मूल सूची में आगे बढ़ाता है (इसलिए इसमें डेटा की अपनी प्रति नहीं है)।

1

आप उपज वापसी का उपयोग फ़िल्टर की गई सूची

IEnumerable<object> FilteredList() 
{ 
    foreach(object item in FullList) 
    { 
     if(IsItemInPartialList(item) 
      yield return item; 
    } 
} 
0

कैसे फ़िल्टर किए गए तत्वों की जरूरत है पहुँचा जा करने के लिए बनाने के लिए कर सकता है? यदि यह एक इटरेटर के माध्यम से है तो हो सकता है कि आप एक कस्टम इटरेटर लिख सकें जो उन तत्वों को छोड़ देता है जिन्हें आप सार्वजनिक रूप से दिखाना नहीं चाहते हैं?

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

(अस्वीकरण: मैं के साथ सी # बहुत परिचित नहीं हूँ, इसलिए इन सामान्य जवाब हैं वहाँ कि बेहतर काम सी # के लिए और अधिक विशिष्ट जवाब हो सकता है।)

1

संग्रह को फ़िल्टर करने की आवश्यकता के आधार पर, आप एक वर्ग बनाना चाहते हैं जो IList (या IENumerable, यदि यह आपके लिए काम करता है) लागू करता है लेकिन यह इंडेक्सिंग और एक्सेस के साथ केवल मिक्स को वापस करने के लिए मक्स करता है चाहते हैं। उदाहरण के लिए

class EvenList: IList 
{ 
    private IList innerList; 
    public EvenList(IList innerList) 
    { 
     this.innerList = innerList; 
    } 

    public object this[int index] 
    { 
     get { return innerList[2*i]; } 
     set { innerList[2*i] = value; } 
    } 
    // and similarly for the other IList methods 
} 
8

इन foreach नमूने ही आप उन्हें और अधिक संक्षिप्त आप .NET 3.5 उपयोग कर रहे हैं बनाने के लिए और LINQ कर सकते हैं, ठीक कर रहे हैं:

return FullList.Where(i => IsItemInPartialList(i)).ToList(); 
संबंधित मुद्दे