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()方法进行解释的整个网页对我来说都是空的.
我错过了什么?
这个例子很糟糕,而且应该感觉很糟糕。这是一个更好的例子,虽然有点做作:
如果我在数组类型上定义了扩展方法,如下所示:
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 行为。
| 归档时间: |
|
| 查看次数: |
2886 次 |
| 最近记录: |