2013-06-05 6 views
6

मैं मूल्यों के एक सेट (सी # में) के साथ प्रकार सूची के चर को प्रारंभ करने का एक तरीका ढूंढ रहा हूं। हां, ऑब्जेक्ट प्रारंभिकता है लेकिन इसके लिए आपको इच्छित प्रत्येक मान के लिए एक नई वस्तु की आवश्यकता है और मैं इसके बजाय इसे टालना चाहूंगा।एक सूची <T> को उन मानों के साथ शुरू करें जो शून्य नहीं हैं

class MyObject 
{ 
    public string Name {get;set;} 
} 
List<MyObject> OldNames = new List<MyObject>(10); 
List<MyObject> NewNames = new List<MyObject>(5); 

यह ठीक है और बांका लेकिन OldNames प्रकार MyObject का एक उद्देश्य के लिए 10 अशक्त संदर्भ शामिल हैं:

यहां एक नमूना है।

एक सूची प्रारंभकर्ता मैं ऐसा कर सकता है का उपयोग करना:।

List<MyObject> OldNames = new List<MyObject>{ 
    new MyObject(), 
    new MyObject(), 
    new MyObject(), 
    etc. 

एक दर्द की तरह है कि के रूप में मैं कई सूची चर और विभिन्न आकारों (exaample के लिए प्रारंभ करने में एक चर 26 वस्तुओं की एक सूची है हाँ है, मैं अपने लिए यह प्रारंभ करने के लिए एक समारोह या शायद विस्तार लिख सकता हूं (एक लूप में जहां मैं आकार प्रदान करता हूं) लेकिन फिर वह कोड है जो मैं लिखना नहीं चाहता हूं।

मुझे उम्मीद है कि कुछ प्रकार का लम्दाबा है या LINQ अभिव्यक्ति या ऑब्जेक्ट्स की सूची को नल के बजाए मूल्यों में प्रारंभ करने के लिए कुछ।

धन्यवाद!

+0

मुझे यकीन नहीं है कि यह वैसे भी एक अच्छा विचार है। आप इसकी आवश्यकता क्यों है? – SWeko

+0

'int' कन्स्ट्रक्टर इसे शून्य आइटमों से भरता नहीं है, यह सूची को खाली छोड़ देता है लेकिन आइटम की उस संख्या के लिए * क्षमता * के साथ। – Rawling

+1

@SWeko यह एक बुरा विचार क्यों है? यदि आप ऐसी चीजों की एक सूची चाहते हैं जो शून्य नहीं हैं तो ऐसा करने के लिए लूप लिखने के बजाय सूची को प्रारंभ करने का एक आसान तरीका होना चाहिए। – Bil

उत्तर

14

पुनरावृत्तियों की संख्या निर्दिष्ट करने के लिए Enumerable.Range LINQ विधि का उपयोग करें। के रूप में इंडेक्सर किसी भी तरह से नहीं किया जाता है

List<MyObject> NewNames = Enumerable.Range(1,5).Select(i => new MyObject()).ToList(); 

संख्या 1 यहाँ, मनमाना है।

+2

संख्यात्मक। दोहराना (5) कभी भी थोड़ा बेहतर –

+0

@ डेवबिश हाँसिस, आप सही हैं। संपादित :) – Rotem

+6

ध्यान दें कि यह 5 बार एक ही संदर्भ का उपयोग करेगा, जो मूल कोड के समान नहीं है। –

1

अपने आप को एक बनाएँ और कार्य शुरू करें।

public List<T> CreateAndInitialize<T>(int size, Func<int, T> init) 
{ 
    var result = new List<T>(size); 
    for (int i = 0; i < size; ++i) 
    result.Add(init(i)); 
    return result; 
} 

फिर

List<MyObject> newNames = CreateAndInitialize(15, i => return new MyObject()); 

मैं init प्रतिनिधि में वस्तु का सूचकांक में पारित करने के लिए इतना है कि आप उस तक जिम्मेदार होती है अगर जरूरत चुना है।

+0

ध्यान दें कि आपकी लैम्ब्डा अभिव्यक्ति 'i => new MyObject() ' –

+0

के रूप में सरल होगी, मैंने कोशिश की लेकिन यह काम नहीं करता है। परिणाम। नई सूची कॉल के बाद गणना 0 है। इसे परिणाम के साथ नई सूची (आकार) के रूप में फिर से लिखना था। शरीर में जोड़ें (init()) ताकि काम करता हो। – Bil

+0

टिप्पणियों के आधार पर, मैंने अपना जवाब अपडेट कर दिया है। सीटीओआर के आकार को पास करने से सूची में तत्वों के लिए बस पूर्व आवंटित किया जाता है। लेकिन आकार अभी भी 0 है। –

3

बस एक त्वरित संगीत ... आप Enumerable.Repeat का उपयोग कर सकते हैं ... बस पहले ऐसा नहीं किया गया है। यह काम करेगा:

var query = Enumerable.Repeat<Func<MyObject>>(() => new MyObject(), count) 
         .Select(x => x()) 
         .ToList(); 

मैं सुझाव दे नहीं कर रहा हूँ आप करना चाहिए इस, लेकिन यह Enumerable.Range के लिए एक दिलचस्प विकल्प है।

0

मुझे लगता है कि आप नई घोषणा के बाद() कोष्ठक खो रहे हैं।

private List<MyObject> ObjectList = new List<MyObject>() 
{ 
     new MyObject() { property1= Value1, property2 = "Value2"}, 
     new MyObject() { property1= Value1, property2 = "Value2"} 
}; 
संबंधित मुद्दे