在C#中初始化動態大小數組的最簡單方法是什麼?C#數組初始化 - 使用非默認值
這是我能想出
private bool[] GetPageNumbersToLink(IPagedResult result)
{
if (result.TotalPages <= 9)
return new bool[result.TotalPages + 1].Select(b => true).ToArray();
...
在C#中初始化動態大小數組的最簡單方法是什麼?C#數組初始化 - 使用非默認值
這是我能想出
private bool[] GetPageNumbersToLink(IPagedResult result)
{
if (result.TotalPages <= 9)
return new bool[result.TotalPages + 1].Select(b => true).ToArray();
...
Enumerable.Repeat(true, result.TotalPages + 1).ToArray()
未經檢驗的最好的,但你可能只是做到這一點?
return result.Select(p => true).ToArray();
跳過「new bool []」部分?
我真的建議是:
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;
甚至新布爾[計] .Select(x => true).ToArray() – BjartN 2011-01-27 07:07:30
這仍然會分配兩個數組。 – 2011-02-03 05:18:36
編輯:作爲一個評論者指出的那樣,我原來的執行沒有工作。這個版本可以工作,但是基於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擴展方法很多,很多一般。
我不相信你的SetAllValues會工作:在你的lambda表達式中,x不是被引用傳遞的,所以給它賦值並不會改變存儲在數組中的值。 – 2009-05-06 11:46:30
是的,你是完全正確的。我提到我沒有真正編譯它,這會顯示出那個基本的錯誤。我用一個簡單的循環替換了ForEach
如果「靈巧」你的意思是最快的,恐怕Enumerable.Repeat可能比慢20倍的循環。 見http://dotnetperls.com/initialize-array:
Initialize with for loop: 85 ms [much faster]
Initialize with Enumerable.Repeat: 1645 ms
因此,使用Dotnetguy的SetAllValues()方法。
你想要使用不同的值來初始化不同的細胞很多次:
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;
}
只有IPagedResult:IEnumerable的 –
2008-09-26 00:52:10