当前位置:  开发笔记 > 编程语言 > 正文

c#using Array.ForEach Action Predicate包含值类型或字符串的数组

如何解决《c#usingArray.ForEachActionPredicate包含值类型或字符串的数组》经验,为你挑选了1个好方法。

我是否正确认为以下代码段不起作用(数组项未被修改),因为数组是整数,它是值类型.

class Program
{
    public static void Main()
    {
        int[] ints = new int[] { 1,2 };

        Array.ForEach(ints, new Action(AddTen));

        // ints is not modified
    }
    static void AddTen(int i)
    {
        i+=10;
    }
}

如果示例使用字符串数组,则可能会应用相同的结果,大概是因为字符串是不可变的.

我的问题是: -

有没有解决的办法?我无法更改回调方法的签名 - 例如通过添加ref关键字,我不想用类包装值类型 - 这将工作...

(当然,我可以简单地编写一个老式的foreach循环来执行此操作!)



1> Marc Gravell..:

您只是更改局部变量 - 而不是列表中的项目.要执行此操作,您需要ConvertAll创建新的列表/数组:

    int[] ints = new int[] { 1,2 };

    int[] newArr = Array.ConvertAll(ints, AddTen);

有:

static int AddTen(int i)
{
    return i+10;
}

这也可以用匿名方法编写:

int[] newArr = Array.ConvertAll(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...
}

但无论如何,你将不得不你的方法中获得价值.除非你改变签名,否则你不能.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有