是否有一個標準函數我可以用它迭代數組類似於ForEach,將函數應用於每個元素並將其替換爲數組中的結果?c#Array.ForEach替代元素替代
類似於下面的內容,但後來維度權力包含每個元素上IntPow(2,i)的結果。我知道我可以用for循環遍歷數組 - 我只是想知道是否有更簡潔的替代方案)。
是否有一個標準函數我可以用它迭代數組類似於ForEach,將函數應用於每個元素並將其替換爲數組中的結果?c#Array.ForEach替代元素替代
類似於下面的內容,但後來維度權力包含每個元素上IntPow(2,i)的結果。我知道我可以用for循環遍歷數組 - 我只是想知道是否有更簡潔的替代方案)。
MSDN文檔說,設計者故意沒有把一個「的ForEach」與陣列由於:1)它是平凡的2)確切地說你的問題 - 人們會對原始數組是否被修改感到困惑。
大多數ForEach類型的數組迭代器實現(實際上需要一個「映射」函數)會返回一個數組的新實例。例如,你可以使用LINQ:
newArray = dimensionPowers.Select(i => IntPow(2,i)).ToArray();
或更好:
dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2,i)).ToArray();
但是,如果要修改就地原始數組,有好老for循環:
for (int i=0; i < dimensionPowers.Length; i++) { dimensionPowers[i] = IntPow(2,i); }
.NET的設計者迫使您使用這些不同的方法,以便您知道數組何時被修改。
如果你想實現你的就地修改,您可以創建一個擴展方法:
static void ForEachModifyInPlace<T> (this Array<T> array, Func<T,T> map_action) {
for (int i=0; i < array.Length; i++) { array[i] = map_action(array[i]); }
}
感謝您的深入解答。 – user673679 2011-03-27 13:16:59
我不認爲你可以做得更簡潔(使用現有的方法)。
你可能崩潰兩個步驟之一:
dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2, i)).ToArray();
你可以覆蓋'dimensionPowers'? 'dimensionPowers'是否有來自不同地方的多個指針? – Kobi 2011-03-27 13:10:25
你的意思是像'ConvertAll'這樣的基於某種轉換函數返回新數組的東西嗎? – 2011-03-27 13:15:15
dimensionPowers只是一個int [] – user673679 2011-03-27 13:17:35