我是在思考以下代码段不起作用纠正(数组项不被修改)的因为阵列是整数,它是数值类型。

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方法不这样做,它会修改自己的副本。

首先,这是一般危险来修改你foreaching在集合。大多数集合维护内部“版本标记”来跟踪变化的,所以调查员将抛出一个异常时,它会attemt遍历集合修改

至于你的问题,有没有办法可以做到这一点与值类型和Array.ForEach。使用foreachConvert做你想做的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top