2008-09-25 13 views
31

सी # में गतिशील आकार की सरणी को प्रारंभ करने का सबसे आसान तरीका क्या है जिसे आप जानते हैं?सी # एरे प्रारंभिकरण - गैर-डिफ़ॉल्ट मान

यह सबसे अच्छा मैं के साथ

private bool[] GetPageNumbersToLink(IPagedResult result) 
{ 
    if (result.TotalPages <= 9) 
     return new bool[result.TotalPages + 1].Select(b => true).ToArray(); 

    ... 

उत्तर

34

उपयोग Enumerable.Repeat

Enumerable.Repeat(true, result.TotalPages + 1).ToArray() 
+1

अब यह सिर्फ चालाक है! – Rob

+12

मुझे लगता है कि निगेल का प्रदर्शन नोट उल्लेख करता है - http://stackoverflow.com/questions/136836/c-array-initialization-with-non-default-value/1051227#1051227 – CrimsonX

+9

मैं विश्वास नहीं कर सकता कि लोगों को किसी चीज़ के लिए अपवर्तित करना है तो 'अजीब' (मेरी राय में) और एक सरणी भरने के रूप में सरल के रूप में एक ऑपरेशन के लिए महंगा है। 'var arr = new type [10]; के लिए (int i = 0; i Aidiakapi

0

Untested आ सकता है, लेकिन आप केवल ऐसा कर सकता है?

return result.Select(p => true).ToArray(); 

"नया बूल []" भाग छोड़ना?

+1

केवल IPagedResult यदि: IEnumerable

5

मैं वास्तव में इस सुझाव है:

return Enumerable.Range(0, count).Select(x => true).ToArray(); 

इस तरह आप केवल एक सरणी का आवंटन।

var array = new bool[count]; 

for(var i = 0; i < count; i++) { 
    array[i] = true; 
} 

return array; 
+1

या नए bool [गिनती ]। चयन करें (x => सत्य)। ToArray() – BjartN

+2

वह अभी भी दो सरणी आवंटित करेगा। –

13

संपादित करें: के रूप में एक टिप्पणीकार ने बताया, मेरे मूल कार्यान्वयन काम नहीं किया यह अनिवार्य रूप से व्यक्त करने के लिए एक अधिक संक्षिप्त तरीका है। यह संस्करण काम करता है लेकिन लूप के आस-पास स्थित गैर-स्लिम है।

यदि आप एक विस्तार विधि बनाने के लिए तैयार हैं, तो आप इस

public static T[] SetAllValues<T>(this T[] array, T value) where T : struct 
{ 
    for (int i = 0; i < array.Length; i++) 
     array[i] = value; 

    return array; 
} 

कोशिश करते हैं और उसके बाद इस

bool[] tenTrueBoolsInAnArray = new bool[10].SetAllValues(true); 

एक विकल्प के रूप की तरह यह आह्वान है, अगर आप के साथ खुश हैं सकता है एक कक्षा लटक रही है, आप इस तरह की कोशिश कर सकते हैं

public static class ArrayOf<T> 
{ 
    public static T[] Create(int size, T initialValue) 
    { 
     T[] array = (T[])Array.CreateInstance(typeof(T), size); 
     for (int i = 0; i < array.Length; i++) 
      array[i] = initialValue; 
     return array; 
    } 
} 

जो आप हालांकि मैं lurv विस्तार तरीकों बहुत सारे और बहुत करना सामान्य रूप में की तरह

bool[] tenTrueBoolsInAnArray = ArrayOf<bool>.Create(10, true); 

सुनिश्चित नहीं हैं कि मैं पसंद आह्वान कर सकते हैं,।

+0

मुझे विश्वास नहीं है कि आपके SetAllValues ​​काम करेंगे: आपके लैम्ब्डा अभिव्यक्ति में, x संदर्भ द्वारा पारित नहीं किया गया है, इसलिए इसे मान निर्दिष्ट करने से सरणी में संग्रहीत मान नहीं बदला जाता है। –

+0

हाँ, आप बिल्कुल सही हैं। मैंने उल्लेख किया कि मैंने वास्तव में इसे संकलित नहीं किया था जो कि प्राथमिक त्रुटि को दिखाता। मैंने फॉरएच को एक साधारण लूप के साथ बदल दिया और यह ठीक काम करता है, लेकिन यह पूछताछ के रूप में यह चालाक नहीं है। –

+1

इसके अलावा, आपके एक्सटेंशन विधि में एक हस्ताक्षर है जिसका अर्थ है कि यह एक नई सरणी लौटाएगा, लेकिन यह मूल सरणी को संशोधित करता है और इसके बदले में लौटाता है। बुरा रूप का। –

70

यदि 'slickest' आप सबसे तेजी से मतलब द्वारा, मुझे डर है कि Enumerable.Repeat पाश के लिए 20x एक की तुलना में धीमी हो सकता हूँ। http://dotnetperls.com/initialize-array देखें:

Initialize with for loop:    85 ms [much faster] 
Initialize with Enumerable.Repeat: 1645 ms 

तो Dotnetguy के SetAllValues ​​() विधि का उपयोग करें।

+11

+1। – AMissico

1

कई बार आप विभिन्न मूल्यों के साथ अलग-अलग सेलों को प्रारंभ करना चाहते हैं:

public static void Init<T>(this T[] arr, Func<int, T> factory) 
{ 
    for (int i = 0; i < arr.Length; i++) 
    { 
     arr[i] = factory(i); 
    } 
} 

या कारखाने स्वाद में:

public static T[] GenerateInitializedArray<T>(int size, Func<int, T> factory) 
{ 
    var arr = new T[size]; 
    for (int i = 0; i < arr.Length; i++) 
    { 
     arr[i] = factory(i); 
    } 
    return arr; 
} 
संबंधित मुद्दे