2008-09-25 100 views
31

在C#中初始化動態大小數組的最簡單方法是什麼?C#數組初始化 - 使用非默認值

這是我能想出

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

    ... 

回答

0

未經檢驗的最好的,但你可能只是做到這一點?

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

跳過「new bool []」部分?

+1

只有IPagedResult:IEnumerable的 2008-09-26 00:52:10

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

甚至新布爾[計] .Select(x => true).ToArray() – BjartN 2011-01-27 07:07:30

+2

這仍然會分配兩個數組。 – 2011-02-03 05:18:36

13

編輯:作爲一個評論者指出的那樣,我原來的執行沒有工作。這個版本可以工作,但是基於for循環是非常不流暢的。

如果你願意創建一個擴展方法,你可以試試這個

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; 
    } 
} 

你可以調用像

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

不知道這是我比較喜歡的,雖然我做lurv擴展方法很多,很多一般。

+0

我不相信你的SetAllValues會工作:在你的lambda表達式中,x不是被引用傳遞的,所以給它賦值並不會改變存儲在數組中的值。 – 2009-05-06 11:46:30

+0

是的,你是完全正確的。我提到我沒有真正編譯它,這會顯示出那個基本的錯誤。我用一個簡單的循環替換了ForEach ,這工作正常,但它不像問題者要求的那樣光滑。 – 2009-05-06 12:53:24

70

如果「靈巧」你的意思是最快的,恐怕Enumerable.Repeat可能比慢20倍的循環。 見http://dotnetperls.com/initialize-array

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

因此,使用Dotnetguy的SetAllValues()方法。

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; 
}