2009-10-08 13 views
6

मैं यह जानना चाहता हूं कि List<T> को प्रारंभ करने का कोई तरीका है या नहीं, T एक object है जो एक साधारण संग्रह की तरह शुरू होता है?ऑब्जेक्ट संग्रह के लिए ऑब्जेक्ट इनिशिलाइज़र

Simple Collection Initializer:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

Object Collection Initilizer:

List<ChildObject> childObjects = new List<ChildObject> 
{  
     new ChildObject(){ Name = "Sylvester", Age=8 }, 
     new ChildObject(){ Name = "Whiskers", Age=2 }, 
     new ChildObject(){ Name = "Sasha", Age=14 } 
}; 

सवाल यह है, कैसे और आप इस तरह कुछ कर सकते हैं तो क्या होगा?

List<ChildObject> childObjects = new List<ChildObject> 
{  
     { "Sylvester", 8} , {"Whiskers", 2}, {"Sasha", 14} 
}; 

उत्तर

1

आप कर सकते हैं ली के जवाब के अनुसार List<ChildObject> से प्राप्त अपनी खुद की कक्षा बनाये बिना ऐसा करें। यह दुर्भाग्यपूर्ण है कि विस्तार के तरीकों संग्रह initalizers के लिए विचार नहीं किया जाता है, अन्यथा यह काम करेगा:

// This doesn't work, but it would if collection initializers checked 
// extension methods. 
using System; 
using System.Collections.Generic; 

public class ChildObject 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public static class Extensions 
{ 
    public static void Add(this List<ChildObject> children, 
          string name, int age) 
    { 
     children.Add(new ChildObject { Name = name, Age = age }); 
    } 
} 

class Test 
{ 
    static void Main(string[] args) 
    { 
     List<ChildObject> children = new List<ChildObject> 
     { 
      { "Sylvester", 8 }, 
      { "Whiskers", 2 }, 
      { "Sasha", 14 } 
     }; 
    } 
} 
+0

यही वह है जिसे मैं उम्मीद कर रहा था। –

0

निकटतम आपको लगता है कि करने के लिए प्राप्त कर सकते हैं कि उन तर्कों को स्वीकार करता है अपनी कक्षा पर एक पैरामिट्रीकृत निर्माता बनाने के लिए है। यही कारण है कि आप सभी तरह से मिल जाएगा नहीं है, लेकिन आप कम से कम कर सकते हैं:

List<ChildObject> childObjects = new List<ChildObject> 
{  
     new ChildObject("Sylvester", 8) , 
     new ChildObject("Whiskers", 2), 
     new ChildObject("Sasha", 14) 
}; 
3

आप संग्रह initializers के लिए the docs को देखें, तो यह सब के बारे में संग्रह की विधि जोड़ें है। बस अपने प्रकार के बंद जेनेरिक सूची को उपclass और नग्न पैरामीटर के साथ एक विधि जोड़ें। जैसा

public class MyColl : List<ChildObject> 
{ 
    public void Add(string s1, int a1, int a2) 
    { 
     base.Add(new ChildObject(s1, a1, a2)); 
    } 
} 

public class ChildObject 
{ 
    public ChildObject(string s1, int a1, int a2) 
    { 
     //... 
    } 
} 

फिर बुला ऐसा लगता है कि: सबसे अच्छा आप शायद कर सकते हैं

static void Main(string[] args) 
    { 
     MyColl x = new MyColl 
     { 
      {"boo", 2, 4}, 
      {"mang", 3, 5}, 
     }; 
    } 
3

कुछ इस तरह है:

public class MyListOfChildObjects : List<ChildObject> 
{ 
    public void Add(string name, int age) 
    { 
     Add (new ChildObject { Name = name, Age = age }); 
    } 
} 

var childObjects = new MyListOfChildObjects 
{ 
    { "Sylvester", 8 } , { "Whiskers", 2 }, { "Sasha", 14 } 
}; 

आप इसे अधिक सामान्य बना सकता है, लेकिन कैसे हैं आप पता है कि प्रत्येक संपत्ति के लिए कौन से तर्क बाध्य किए जाने चाहिए?

public class MyList<T> : List<T> 
{ 
    public void Add(params object[] arguments) 
    { 
     // what order should I bind the values to? 
    } 
} 

var childObjects = new MyList<ChildObject> 
{ 
    { "Sylvester", 8 } , { "Whiskers", 2 }, { "Sasha", 14 } 
}; 
+0

बस जवाब की पूर्णता के लिए: अभी भी सूची के लिए विस्तार विधि के रूप में होने के संग्रह का उपयोग करने नहीं दूँगा प्रारंभकर्ता सिंटैक्स के रूप में यह संकलित नहीं करता है (त्रुटि: "विधि के लिए कोई अधिभार नहीं 'जोड़ें' लेता है '2' तर्क")। –

3

आप अपनी खुद की संग्रह जो List<ChildObject> फैली बनाने के द्वारा पास हो जाते हैं और अपने खुद के जोड़ने तरीका प्रदान कर सकते हैं:

public class ChildObjectCollection : List<ChildObject> 
{ 
    public void Add(string name, int age) 
    { 
     this.Add(new ChildObject(name, age)); 
    } 
} 

फिर आप इसे इस तरह आरंभ कर सकते हैं:

var childObjects = new ChildObjectCollection 
{ 
    { "Sylvester", 8} , {"Whiskers", 2}, {"Sasha", 1 } 
}; 
संबंधित मुद्दे