2009-01-28 35 views
0

我們知道,如果您有:轉換的代碼片段存在使用Array.ForEach

var aa = new [] { 1, 2, 3, 4, 5 }; 
for (int i = 0; i < aa.length; ++i) 
{ 
    aa[i] = aa[i] + 1; 
} 

它真的

var aa = new [] { 1, 2, 3, 4, 5 }; 
Arrary.ForEach(aa, a => a + 1); 

但是,如果我有這樣的內容:

var aa = new [] { 1, 2, 3, 4, 5 }; 
var ab = new [] { 1, 2, 3, 4, 5 }; 
for (int i = 0; i < aa.length; ++i) 
{ 
    aa[i] = ab[i] + 1; 
} 

我可以將其轉換爲僅使用一個Array.ForEach?或者,如果你想讓所有函數式編程變得瘋狂,你會怎麼做呢?笨重的循環看起來很醜。

+0

我無法獲得您的第一個ForEach代碼來編譯。 「新動作(a => a + 1)」沒有意義,因爲「a => a + 1」是動作,「a + 1」不是說明。 – 2009-01-28 04:12:10

+0

對不起,我現在在工作,所以我不在.Net框架3.5上。我知道使用委託可以工作,但我不確定它是否可以改爲使用lambda表達式,而不是...... – 2009-01-28 04:17:03

+0

「或者,如果你想讓所有函數編程變得瘋狂,你會怎麼做呢?」 - 使用F#:) – MichaelGG 2009-02-06 04:05:13

回答

1

這會不會是快,但它只是可能會奏效

var aa = new [] { 1, 2, 3, 4, 5 }; 
var ab = new [] { 1, 2, 3, 4, 5 }; 
Array.ForEach(aa, new Action(a => ab[Array.IndexOf(a)] + 1)); 

可惜thiswill不具有重複元素的數組工作。

+0

爲什麼它不會很快? – 2009-01-28 04:01:06

2

這不是很漂亮,但這種將工作(使用返回元素的索引的選擇()過載):

var aa = new[] { 1, 2, 3, 4, 5 }; 
var ab = new[] { 1, 2, 3, 4, 5 }; 

Array.ForEach(
    aa.Select((x, i) => i).ToArray(), 
    i => aa[i] = ab[i] + 1); 

恕我直言,一個簡單的「for」循環是一個更容易理解本案件。

2

另一個類似的辦法:

Enumerable.Range(0, ab.Length).Select(i => aa[i] = ab[i] + 1); 
// Will not work if aa.Length != ab.Length 
4

如何:

aa = ab.ConvertAll(x => x+1); 
-1

不是一個直接的答案,但你要ForEach2,這在兩個序列/數組迭代。不幸的是,這不包括BCL,所以你必須添加它。但是,如果您嘗試在C#中執行功能,您可能會有一個幫助程序庫,所以這不是什麼大不了的事情。

0
var aa = new[] { 1, 2, 3, 4, 5 }; 
var ab = new[] { 1, 2, 3, 4, 5 }; 

var index = 0; 
Array.ForEach(aa, a => { aa[index] = ab[index] + 1; index++; }); 

這不行嗎?它的1個Array.ForEach與索引器保存在Array.ForEach之外。