我认为以下代码段不起作用(数组项未修改)是否正确?因为数组是值类型的整数。
class Program
{
public static void Main()
{
int[] ints = new int[] { 1,2 };
Array.ForEach(ints, new Action<int>(AddTen));
// ints is not modified
}
static void AddTen(int i)
{
i+=10;
}
}
如果示例使用字符串数组,这同样适用,大概是因为字符串是不可变的。
我的问题是:-
有解决办法吗?我无法更改回调方法的签名 - 例如通过添加 ref 关键字并且我不想用类包装值类型 - 这会起作用......
(当然,我可以简单地写一个老式的 foreach 循环来做到这一点!)
最佳答案
您只是在更改局部变量 - 而不是列表中的项目。为此,您需要 ConvertAll
,它会创建一个新的列表/数组:
int[] ints = new int[] { 1,2 };
int[] newArr = Array.ConvertAll<int,int>(ints, AddTen);
与:
static int AddTen(int i)
{
return i+10;
}
这也可以用匿名方法写成:
int[] newArr = Array.ConvertAll<int,int>(ints,
delegate (int i) { return i+ 10;});
或者在 C# 3.0 中作为 lambda:
int[] newArr = Array.ConvertAll(ints, i=>i+10);
除此之外... for
循环:
for(int i = 0 ; i < arr.Length ; i++) {
arr[i] = AddTen(arr[i]); // or more directly...
}
但无论如何,您都必须从您的方法中获取值。除非您更改签名,否则不能。
关于c# 将 Array.ForEach 操作谓词与值类型或字符串的数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/561170/