Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多播委托始终执行最后一个操作_C#_Delegates - Fatal编程技术网

C# 多播委托始终执行最后一个操作

C# 多播委托始终执行最后一个操作,c#,delegates,C#,Delegates,因此,我有以下代码: namespace ConsoleApplication1 { public delegate int Transformer(int x); class Test { public static void Transform(int[] values, Transformer t) { for (int i = 0; i < values.Length; i++)

因此,我有以下代码:

namespace ConsoleApplication1
{
    public delegate int Transformer(int x);

    class Test
    {
        public static void Transform(int[] values, Transformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t(values[i]);
            }
        }

       static int Square(int x)
        {
            return x * x;
        }

        static int Minus(int x)
       {
           return x - 1;
       }

        static void Main()
        {
            int[] values = { 1, 2, 3 };
            Transformer t = Test.Minus;
            t += Test.Square;

            Test.Transform(values, t);

            foreach (int i in values)
            {
                Console.Write(i + " ");
            }
        }
    }
}
命名空间控制台应用程序1
{
公共代表int变压器(int x);
课堂测试
{
公共静态无效转换(int[]值,转换器t)
{
for(int i=0;i

为什么它总是只对数组执行最后一个操作(在我的例子中是正方形)。我需要更改什么才能使其同时执行减号和平方?

多播代理始终返回链中最后一个代理的值。由于不修改Test.减号和Test.Square中的值,而是返回新值,所以只应用后者。解决这个问题的最简单方法是让您的转换器通过引用获取值并修改它们。e、 g:


namespace ConsoleApplication1
{
    public delegate void Transformer(ref int x);

    class Test
    {
        public static void Transform(int[] values, Transformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                t(ref values[i]);
            }
        }

       static void Square(ref int x)
       {
           x = x * x;
       }

       static void Minus(ref int x)
       {
           x = x - 1;
       }

        static void Main()
        {
            int[] values = { 1, 2, 3 };
            Transformer t = Test.Minus;
            t += Test.Square;

            Test.Transform(values, t);

            foreach (int i in values)
            {
                Console.Write(i + " ");
            }
        }
    }
}

命名空间控制台应用程序1
{
公共代表无效变压器(参考int x);
课堂测试
{
公共静态无效转换(int[]值,转换器t)
{
for(int i=0;i

因为结果不是通过所有代理链接的

该代码相当于

 Minus(1);
 return Square(1);
更改代码以就地更改变量

 public delegate void Transformer(ref int x);

    public static void Transform(int[] values, Transformer t)
    {
        for (int i = 0; i < values.Length; i++)
        {
            t(ref values[i]);
        }
    }

   static void Square(ref int x)
    {
        x*= x;
    }

    static void Minus(ref int x)
   {
       x--;
   }

在此调用之后,返回值=因此,源代码保持不变

public static int[] Transform(int[] values, params Func<int,int>[] t){
  return values.Select(v=>t.Aggregate(v,(x,f)=>f(x))).ToArray();
}
values=Transform(values,new[] { Minus,Square });
int[] values = {1,2,3};
int[] result = Transform(values,Minus,Square);