【问题标题】:Applying Action Delegate应用动作委托
【发布时间】:2009-10-22 14:12:48
【问题描述】:

只是为了理解集合,我试图找到传入的每个数字的平方 收藏。

我的代码是(当然我可以用不同的方式实现,只是为了知道强制转换,我做了一个虚拟实现)。

   static void Main()
   {
      ICollection<int> Present = (ICollection<int>)
                                  a.GetNumbers(new int[]{1,2,3});

       foreach (int i in Present)
       {
                   Console.WriteLine("{0}", i);
       }
   }


  public IEnumerable<int> GetNumbers(int[] Numbers)
  {
     //first trial
     ICollection<int> col = 
                           Array.ForEach(Numbers, delegate { x => x * x; });

     //second trial
     ICollection<int> col = Array.ForEach(Numbers, ( x => x * x ));

     return (IEnumerable<int>)col.GetEnumerator();

  }

在 GetNumbers() 中的两条路径中的 Array.ForEach 有什么问题?

我收到“允许分配和调用增量”。错误。

【问题讨论】:

    标签: c# collections


    【解决方案1】:

    Action 不返回任何内容,Array.ForEach 也不返回任何内容 - 但是您的 lambda 表达式确实如此,并且您尝试使用 Array.ForEach 的结果,尽管它是一个 void 方法。改用Array.ConvertAll,它使用Converter&lt;TInput, TOutput&gt;(相当于Func&lt;TIn, TOut&gt;)。

    或者,如果您想探索Array.ForEachAction,请执行以下操作:

    Array.ForEach(Numbers, x => Console.WriteLine(x * x));
    

    (另外,您的第一次尝试似乎是匿名方法语法和 lambda 语法的混合。那是行不通的。)

    像这样:

    int[] squares = Array.ConvertAll(numbers, x => x*x);
    

    【讨论】:

    • 乔恩,我在 GetNumbers(..) { return (IEnumerable)Array.ConvertAll(Numbers, ( x => x * x )).GetEnumerator(); .... 在 Main() 中我也实现了 .... IEnumerable Present = (IEnumerable)a.GetNumbers(new int[]{1,2,3}).GetEnumerator(); ....我收到强制转换错误“无法将'SZArrayEnumerator'类型的对象强制转换为'System.Collections.Generic.IEnumerable`1[System.Int32]'。”
    • 您的方法被声明为返回IEnumerable&lt;int&gt;,而不是IEnumerator&lt;int&gt; - 不要调用GetEnumerator()。在您的主要方法中也是如此。你为什么要调用 GetEnumerator()?
    【解决方案2】:

    这是 LINQ 扩展方法派上用场的教科书示例,您为什么不这样做:

    public IEnumerable<int> GetNumbers(IEnumerable<int> numbers)
    {
        return numbers.Select(x => x * x);
    }
    

    【讨论】:

    • 所以间接地说,即使是小学生也能做到这一点。 :) 凉爽的。 :) 正如我在帖子中提到的那样,我尝试了使用 Array 的可能性。无论如何,我感谢您的回答。
    • 我的意思是说“教科书”,因为它是 LINQ 真正闪耀的一个漂亮而干净的例子。没有冒犯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多