无法在int []上调用allAll

时间:2014-12-30 09:39:39

标签: c#

我正在阅读有关查询语法的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.bNed Stoyanov答案都有效,但不是书中的例子。
我应该认为这只是一个错误的例子吗?

我刚注意到AsParallel没有从示例中产生预期的结果 在精神上运行示例代码时,它应按升序打印0到99 * 99之间的数字,而AsParallel打印数字但不是相同的顺序。所以我猜AsParallel不是确切的答案,不是吗?

3 个答案:

答案 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()));