为什么要将AsEnumerable()方法应用于数组?

Gen*_*нин 5 c# linq arrays ienumerable list

我正在阅读C#AsEnumerable:

"IEnumerable接口是一个通用接口.这意味着它定义了一个类型可以实现循环的模板.AsEnumerable方法,一个通用方法,允许你将特定类型转换为它的IEnumerable等价物"

接下来,代码示例:

using System;
using System.Linq;

class Program
{
   static void Main()
   {
       // Create an array type.
        int[] array = new int[2];
        array[0] = 5;
        array[1] = 6;
        // Call AsEnumerable method.
        var query = array.AsEnumerable();
        foreach (var element in query)
        {
            Console.WriteLine(element);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

听起来我需要将数组转换为IEnumerable类型对象以使用循环(foreach?).

但是将foreach直接应用于数组会产生完全相同的结果:

using System;
//using System.Linq;

class Program
{
    static void Main()
    {
        // Create an array type.
        int[] array = new int[2];
        array[0] = 5;
        array[1] = 6;
        // Call AsEnumerable method.
        //var query = array.AsEnumerable();
        foreach (var element in array)
        {
            Console.WriteLine(element);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对AsEnumerable()方法进行解释的整个网页对我来说都是空的.
我错过了什么?

SWe*_*eko 4

这个例子很糟糕,而且应该感觉很糟糕。这是一个更好的例子,虽然有点做作:

如果我在数组类型上定义了扩展方法,如下所示:

public static class ArrayExtension {

    public static bool Any<T>(this T[] source, Func<T,bool> predicate)
    {
       Console.WriteLine("Undesirable side behaviour");
       SomeResourceIntensiveOperation();

       Console.WriteLine("Inefficient implementation");
       return source.Where(predicate).Count() != 0;
    }

}
Run Code Online (Sandbox Code Playgroud)

我做

int[] nums = new []{1,2,3,4,5};
nums.Any(n=> n % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

如果将执行并运行我的实现,即使我不需要它。通过做

nums.AsEnumerable().Any(n => n % 2 == 0);
Run Code Online (Sandbox Code Playgroud)

它将调用默认实现。

真正的好处是当您使用IQueryable实现(例如 LINQ-to-SQL)时,因为例如, for WhereIEnumerable定义为

public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate) 
Run Code Online (Sandbox Code Playgroud)

但 的IQueryable.Where定义是

public static IQueryable<TSource> Where<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, bool>> predicate)
Run Code Online (Sandbox Code Playgroud)

当 IQueryable 行为不受欢迎时,可以调用AsEnumerable()来强制 IEnumerable 行为。

  • @TomTom 你一定完全疯了。这个例子*完美*地说明了 `AsEnumerable` 的作用。特别是,这是一个**最小**示例。它只包含最少的成分来说明其用途。我建议你可以在这个问题上睡一晚,然后再回来看一遍。 (6认同)