我们知道如果你有:
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看起来很丑陋。
答案 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#中做功能,你可能会有一个帮手库,所以这并不是什么大不了的事。