2009-10-22 62 views
0

只是为了理解收集,我试图找到每个编号传入一个 集合的平方。我的代码是(当然,我可以用不同的方式实现,只是知道投射它,我做了一个虚拟实现)。申请行动代表

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(); 

    } 

Array.ForEach在GetHumbers()中的两个h路径中有什么问题?

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

回答

2

Action不会返回任何内容,也不会返回Array.ForEach - 但是您的lambda表达式的确如此,尽管它是一种无效方法,但您仍尝试使用Array.ForEach的结果。改为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); 
+0

乔恩,我改变了我的发言里面GetNumbers(..){回报(IEnumerable的)Array.ConvertAll(数字,(X => X * X))的GetEnumerator(。 ); } ....在Main()我也实现了.... IEnumerable Present =(IEnumerable )a.GetNumbers(new int [] {1,2,3})。GetEnumerator(); ....我收到了投射错误“无法投射'SZArrayEnumerator'类型的对象来键入'System.Collections.Generic.IEnumerable'1 [System.Int32]'。” – Kalai 2009-10-22 14:36:54

+0

您的方法被声明为返回IEnumerable 而不是IEnumerator 不要调用GetEnumerator()。你的主要方法也是如此。你为什么要调用GetEnumerator()? – 2009-10-22 14:53:26

0

这是在LINQ扩展方法派上用场,学校书例子,为什么你不只是这样做:

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

所以间接地告诉你,即使是一个男生也可以做到这一点。 :)很酷。 :)正如我在我的帖子中提到的,我尝试使用Array.anyhow我很欣赏你的答案。 – Kalai 2009-10-22 14:40:54

+0

我的意思是说“文本书”,因为它是LINQ真正闪耀的一个很好和干净的例子。没有恶意。 – SoftMemes 2009-10-23 07:45:56