2009-12-12 17 views
9

मैं एक वर्ग है, जो एक सूची से अधिक सिर्फ एक आवरण है, यानी है के लिए,लागू IEnumerable <T> एक सूची आवरण

public class Wrapper 
{ 
    public List<int> TList 
    {get;set;} 
    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 

मैं IEnumerable से Wrapper inherits बनाने के लिए इतना है कि मैं निम्न सिंटैक्स का उपयोग कर सकते हैं:

Wrapper wrapper = new Wrapper() 
         { 
         2,4,3,6 
         }; 

किसी भी विचार कैसे जो इंटरफेस IEnumerable<T>, या IEnumerable, और लागू करने के लिए करने के लिए कैसे विधि शरीर को परिभाषित करने के?

+0

नहीं, IENumerable के साथ यह काम नहीं करेगा। मुझे लगता है कि आपको आईसीओलेक्शन लागू करना होगा। – deerchao

+3

नहीं, डीरचाओ, इसे IENumerable की आवश्यकता है। हमें * आईसीओलेक्शन की आवश्यकता नहीं है, बेशक, ऐसा करने के लिए समझदारी है। –

उत्तर

32

यदि आप ICollection<int> लागू करते हैं तो आपको वांछित कार्यक्षमता मिलती है। यह आम तौर पर की सिफारिश की है कि;

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    { get; private set; } 
    public Wrapper() 
    { 
     TList = new List<int>(); 
    } 

    public void Add(int item) 
    { 
     TList.Add(item); 
    } 
    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

(मैं भी बनाने की स्वतंत्रता ले लिया TList सेटर निजी:

सुधार: आप वास्तव में केवल लागू IEnumerable या IEnumerable<T> और अपनी कक्षा में एक सार्वजनिक Add विधि की आवश्यकता है संग्रह प्रकार गुण केवल पढ़ने के लिए कर रहे हैं ताकि इस तरह के रूप संग्रह प्रकार के बाहर किसी भी कोड द्वारा प्रतिस्थापित नहीं किया जा सकता है)

+0

दमनित, आपने मुझे इसे हराया :) – ICR

+0

हमें GetEnumerator के सामान्य और गैर-सामान्य दोनों संस्करणों को लागू करने की आवश्यकता क्यों है? – hdgarrood

+0

@hdgarrood यह आवश्यक है क्योंकि 'IENumerable ' विरासत 'IENumerable' जो जेनेरिक नहीं है। एक प्रकार जो 'IENumerable ' लागू करता है, 'IENumerable' लागू करता है, इसलिए उन विधियों को भी उपस्थित होने की आवश्यकता है। –

9

क्रम संग्रह initializers आप 2 बातें करने की जरूरत है पाने के लिए:।

  1. IEnumerable लागू
  2. एक विधि कहा जाता है सही हस्ताक्षर

इन पाने के लिए बेहतर तरीका ICollection लागू करने के लिए है के साथ जोड़े है, लेकिन कम से कम आपको बस इतना करना है:

public class Wrapper : IEnumerable<int> 
{ 
    public List<int> TList 
    {get;set;} 

    public IEnumerator<int> GetEnumerator() 
    { 
     return TList.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() // Explicitly implement the non-generic version. 
    { 
     return TList.GetEnumerator(); 
    } 

    public void Add(int i) 
    { 
     TList.Add(i); 
    } 

    public Wrapper() 
    { 
     TList=new List<int>(); 
    } 
} 
संबंधित मुद्दे