转换现有的代码片段以使用Array.ForEach

时间:2009-01-28 03:49:10

标签: c# c#-3.0 functional-programming lambda

我们知道如果你有:

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吗?或者,如果你想让所有功能编程疯狂,你会怎么做? Clunky for loop看起来很丑陋。

6 个答案:

答案 0 :(得分:4)

怎么样:

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

答案 1 :(得分:2)

它不漂亮,但这可行(使用返回元素索引的Select()重载):

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 :(得分:2)

另一种类似的方法:

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

答案 3 :(得分: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));

不幸的是,这对于具有重复元素的数组不起作用。

答案 4 :(得分: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之外。

答案 5 :(得分:-1)

不是直接的答案,但你想要ForEach2,它迭代两个序列/数组。不幸的是,这不包括在BCL中,因此您必须添加它。

但是如果你想在C#中做功能,你可能会有一个帮手库,所以这并不是什么大不了的事。