2011-03-27 95 views
3

是否有一個標準函數我可以用它迭代數組類似於ForEach,將函數應用於每個元素並將其替換爲數組中的結果?c#Array.ForEach替代元素替代

類似於下面的內容,但後來維度權力包含每個元素上IntPow(2,i)的結果。我知道我可以用for循環遍歷數組 - 我只是想知道是否有更簡潔的替代方案)。

+0

你可以覆蓋'dimensionPowers'? 'dimensionPowers'是否有來自不同地方的多個指針? – Kobi 2011-03-27 13:10:25

+0

你的意思是像'ConvertAll'這樣的基於某種轉換函數返回新數組的東西嗎? – 2011-03-27 13:15:15

+0

dimensionPowers只是一個int [] – user673679 2011-03-27 13:17:35

回答

9

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]); } 
} 
+0

感謝您的深入解答。 – user673679 2011-03-27 13:16:59

0

我不認爲你可以做得更簡潔(使用現有的方法)。

你可能崩潰兩個步驟之一:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2, i)).ToArray();