使用Array.ForEach动作谓词值类型或字符串的数组c#
题
我是在思考以下代码段不起作用纠正(数组项不被修改)的因为阵列是整数,它是数值类型。
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作为拉姆达:
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...
}
但这种或那种方式,你将要得到的值的出的你的方法。除非您更改签名,你不能。
其他提示
在Array.ForEach()方法不会让你几乎修改它的成员。可以通过使用修改它LINQ诸如此
ints = ints.Select(x => x +10 ).ToArray();
的foreach是唯一的方法,在数组和列表值类型总是被复制,并且因此修改它们是行不通的,除非你存储修改后的值返回。该AddTen方法不这样做,它会修改自己的副本。
首先,这是一般危险来修改你foreach
ing在集合。大多数集合维护内部“版本标记”来跟踪变化的,所以调查员将抛出一个异常时,它会attemt遍历集合修改
至于你的问题,有没有办法可以做到这一点与值类型和Array.ForEach
。使用foreach
或Convert
做你想做的。
不隶属于 StackOverflow