不能在 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不是确切的答案,不是吗?

不能在 int[] 上调用所有内容

您省略了这两行代码之间以及紧随其后的一些重要文本。

摘自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 实现。为 IEnumerablepublic 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()));