应用行动代表

时间:2009-10-22 14:12:48

标签: c# collections

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

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

   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有什么问题?

我收到“允许分配和呼叫增量”。错误。

2 个答案:

答案 0 :(得分:2)

Action没有返回任何内容,Array.ForEach也没有 - 但是你的lambda表达式没有,并且你试图使用Array.ForEach的结果,尽管它是一个void方法。请改为Array.ConvertAll,使用Converter<TInput, TOutput>(相当于Func<TIn, TOut>)。

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

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

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

像这样:

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

答案 1 :(得分:0)

这是LINQ扩展方法派上用场的学校书籍示例,为什么不这样做:

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