C# 我怎么可能对类型为“IEnumerable”的变量使用“ToArray()”
在使用LINQ将匿名类型保存到IEnumerable类型的变量中之后,我发现可以在前面提到的变量上使用在类Enumerable内部定义的几种方法。这怎么可能?还应注意,IEnumerable是一个接口 下面是一个小代码示例:C# 我怎么可能对类型为“IEnumerable”的变量使用“ToArray()”,c#,C#,在使用LINQ将匿名类型保存到IEnumerable类型的变量中之后,我发现可以在前面提到的变量上使用在类Enumerable内部定义的几种方法。这怎么可能?还应注意,IEnumerable是一个接口 下面是一个小代码示例: class MyClass { public string Name; } class Program { static void Main(string[] args) { MyClass[] myArray =
class MyClass
{
public string Name;
}
class Program
{
static void Main(string[] args)
{
MyClass[] myArray =
{
new MyClass{Name = "Bill"},
new MyClass{Name = "Bill"},
new MyClass{Name = "Steve"}
};
IEnumerable<MyClass> variable = from myInstance in myArray
where myInstance.Name == "Bill"
select myInstance;
MyClass[] newArray = variable.ToArray<MyClass>(); // How is it possible for me to use "ToArray<T>()" on "varialble"?
}
}
这使用了一个名为。该方法在一个单独的类中定义,因此得名-它扩展了原始类/接口的功能。第一个参数的前缀是this关键字,可以调用该方法,就好像它是该参数(即IEnumerable)上的方法一样
在您的示例中,您正在使用一个名为LINQ的库,它完全由扩展方法组成。您可以查看ToArray的源代码。您的代码将使用System.Linq;在顶部,这是允许您在代码中调用方法的部分。我使用ToList:from myInstance in myArray,其中myInstance.Name==Bill select myInstance.ToList;所有使用IEnumerable的LINQ方法都是。IEnumerable是一个允许枚举的接口。ToArray所做的只是枚举IEnumerable并创建一个包含所有枚举值的新数组。到底是什么让你觉得奇怪,还是你不明白?使用System.Linq添加;ToArray是一种扩展方法,现在您可以执行var MyArray=variable.ToArray;Jon Skeet写了一系列关于Linq如何工作的有趣博客值得一读。