C# 应用动作委托

C# 应用动作委托,c#,collections,C#,Collections,为了理解这个集合,我试着找出传递给一个集合的每个数字的平方 收藏 我的代码是(当然,我可以用不同的方式实现,只是为了知道转换,我做了一个虚拟实现) static void Main() { ICollection Present=(ICollection) a、 GetNumbers(新的int[]{1,2,3}); foreach(当前为int i) { Console.WriteLine(“{0}”,i); } } 公共IEnumerable GetNumbers(int[]数字) { //

为了理解这个集合,我试着找出传递给一个集合的每个数字的平方 收藏

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

static void Main()
{
ICollection Present=(ICollection)
a、 GetNumbers(新的int[]{1,2,3});
foreach(当前为int i)
{
Console.WriteLine(“{0}”,i);
}
}
公共IEnumerable GetNumbers(int[]数字)
{
//初审
i收集列=
ForEach(数字,委托{x=>x*x;});
//二审
ICollection col=Array.ForEach(数字,(x=>x*x));
返回(IEnumerable)列GetEnumerator();
}
GetNumbers()内两条路径中的Array.ForEach都有什么问题


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

Action
不返回任何内容,
Array.ForEach
也不返回任何内容-但是您的lambda表达式会返回,并且您正在尝试使用
Array.ForEach
的结果,尽管它是一个无效方法。请尝试使用
Array.ConvertAll
,它使用
Converter
(相当于
Func

或者,如果要浏览
Array.ForEach
Action
,请执行以下操作:

Array.ForEach(Numbers, x => Console.WriteLine(x * x));
(另外,您的第一次尝试似乎是匿名方法语法和lambda语法的混合。这是行不通的。)

像这样:

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

这是一个关于LINQ扩展方法方便使用的教科书示例,为什么不这样做:

public IEnumerable<int> GetNumbers(IEnumerable<int> numbers)
{
    return numbers.Select(x => x * x);
}
public IEnumerable GetNumbers(IEnumerable numbers)
{
返回数字。选择(x=>x*x);
}

Jon,我更改了GetNumbers(..{return(IEnumerable)数组中的语句。ConvertAll(Numbers,(x=>x*x)).GetEnumerator();}。。。。在Main()中,我还实现了。。。。IEnumerable Present=(IEnumerable)a.GetNumbers(新int[]{1,2,3}).GetEnumerator()。。。。我收到转换错误“无法将类型为'SZArrayEnumerator'的对象转换为类型为'System.Collections.Generic.IEnumerable`1[System.Int32]”。您的方法被声明为返回一个
IEnumerable
,而不是
IEnumerator
-不要调用
GetEnumerator()
。你的主要方法也是如此。你为什么要调用GetEnumerator()?所以你间接地说,即使是一个小学生也可以做到这一点。:)酷。:)正如我在帖子中提到的,我尝试了使用数组的可能性。无论如何,我感谢你的回答。我的意思是说“文本书”,因为它是LINQ真正闪耀的一个好的、干净的例子。无意冒犯。
public IEnumerable<int> GetNumbers(IEnumerable<int> numbers)
{
    return numbers.Select(x => x * x);
}