我正在阅读有关查询语法的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'的定义没有扩展方法' ForAll'接受类型' int []'的第一个参数可以找到(你错过了使用指令或程序集引用吗?)
我使用了以下指令:
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
不是确切的答案,不是吗?
答案 0 :(得分:3)
PLINQ中有ForAll
,在这种情况下,您的代码应为:
foo.AsParallel().ForAll((n) => Console.WriteLine(n.ToString()));
这是文档的link。 请注意AsParallel
并行调用每个条目的指定操作,因此不会按照可枚举中的条目顺序为每个条目执行lambda。
答案 1 :(得分:3)
您从这两行代码之间省略了一些重要文本,并在它们之后立即删除。
摘自"有效C#(涵盖C#4.0):50种提高C#" 的具体方法:Bill Wagner:
int[] foo = (from n in Enumerable.Range(0, 100) select n * n).ToArray();
然后您可以对第二个循环进行类似的更改,尽管您还需要编写扩展方法来对所有元素执行某些操作:
foo.ForAll((n) => Console.WriteLine(n.ToString()));
.NET BCL在List< T>中有一个ForAll实现。为IEnumerable< T>创建一个很简单:
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()
操作。
答案 2 :(得分:1)
将您的数据结构更改为List<int>
并在其上调用ForEach
:
List<int> foo = (from n in Enumerable.Range(0, 100)
select n * n).ToList();
foo.ForEach(n => Console.WriteLine(n.ToString()));