c# 将 Array.ForEach 操作谓词与值类型或字符串的数组一起使用

标签 c# foreach action

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

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/

相关文章:

C#:MySQL 异常未处理

c# - 如何在 C# 中获取列表中新添加项的索引?

c# - EF 6 - 在表编码模式中添加/更新记录

javascript - angular.foreach 函数抛出语法错误

jsf - 如何将 Action 字符串传递给 JSF 2 复合组件?

c# - 可能具有挑战性 : How do I implement solving logic in this puzzle solver program?

javascript - 函数完成时 Nodejs 回调下一个循环

node.js - NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解析,这样我们就不会收到 EMFILE 错误?

objective-c - 是否可以更改 UIButton 的操作?

java - 如何在 Java Swing 中对单击执行多个操作