申请行动代表
问题描述:
只是为了理解收集,我试图找到每个编号传入一个 集合的平方。我的代码是(当然,我可以用不同的方式实现,只是知道投射它,我做了一个虚拟实现)。申请行动代表
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路径中有什么问题?
我收到“允许分配和呼叫增量”。错误。
答
Action
不会返回任何内容,也不会返回Array.ForEach
- 但是您的lambda表达式的确如此,尽管它是一种无效方法,但您仍尝试使用Array.ForEach
的结果。改为Array.ConvertAll
,它使用Converter<TInput, TOutput>
(相当于Func<TIn, TOut>
)。
另外,如果你想探索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);
}
乔恩,我改变了我的发言里面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
您的方法被声明为返回IEnumerable而不是IEnumerator 不要调用GetEnumerator()。你的主要方法也是如此。你为什么要调用GetEnumerator()? –
2009-10-22 14:53:26