不能在 int[] 上调用所有内容
本文关键字:调用 int 不能 | 更新日期: 2023-09-27 18:35:36
我正在阅读有关查询语法Effective C# by Bill Wagner
,有这个例子:
int[] foo = (from n in Enumerable.Range(0, 100)
select n * n).ToArray();
foo.ForAll((n) => Console.WriteLine(n.ToString()));
测试时出现此错误:
'int[]' 不包含 'ForAll' 的定义,并且找不到接受类型为 'int[]' 的第一个参数的扩展方法 'ForAll'(您是否缺少 using 指令或程序集引用?
我使用了以下指令:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
我还错过了什么?
提前致谢
更新:在VS 2012和.Net 4.5上进行测试
w.b和Ned Stoyanov都回答了工作,但不是书中的例子。
我应该认为这只是一个错误的例子吗?
我刚刚注意到AsParallel
没有从示例中产生预期的结果。
在心理上运行示例代码,它应该按升序打印从 0 到 99*99 的数字,而AsParallel
打印数字但不相同的顺序。所以我想AsParallel
不是确切的答案,不是吗?
您省略了这两行代码之间以及紧随其后的一些重要文本。
摘自Bill Wagner的"Effective C#(涵盖C# 4.0):改进C#的50种特定方法":
int[] foo = (from n in Enumerable.Range(0, 100) select n * n).ToArray();
然后,您可以对第二个循环进行类似的更改,尽管您还需要编写一个扩展方法来对所有元素执行一些操作:
foo.ForAll((n) => Console.WriteLine(n.ToString()));
.NET BCL 在 List
中有一个 ForAll 实现。为 IEnumerable : public static class Extensions { public static void ForAll<T>( this IEnumerable<T> sequence, Action<T> action) { foreach (T item in sequence) action(item); } }
他自己创建了一个ForAll
扩展方法,因此您也需要复制该代码才能编译程序。它只是一个扩展方法,它使用 foreach
循环访问foo
中的元素并对每个元素执行Console.WriteLine()
操作。
PLINQ 中有一个ForAll
,在这种情况下,您的代码应为:
foo.AsParallel().ForAll((n) => Console.WriteLine(n.ToString()));
这是文档的链接。请注意,AsParallel
并行调用每个条目的指定操作,因此不会按照枚举项中条目的顺序为每个条目执行 lambda。
将数据结构更改为 List<int>
并对其调用ForEach
:
List<int> foo = (from n in Enumerable.Range(0, 100)
select n * n).ToList();
foo.ForEach(n => Console.WriteLine(n.ToString()));