实现IEnumerable接口
本文关键字:接口 IEnumerable 实现 | 更新日期: 2023-09-27 17:58:04
我知道IEnumerable是一个接口,我也知道当一个类实现一个接口时,它必须为该接口中的方法实现特定的主体。我最近一直在写一个程序,我觉得我需要将Ienumerable实现到我的一个类中,以便在foreach循环中使用它。在我这样做之后,是这样做的:
class FData: IEnumerable<EClass> {
// Removed the irrelevant contents
public IEnumerator<EnumerableClass> GetEnumerator()
{
for (int i = 0; i < Emp_Id.Count; i++) {
yield return (new EnumerableClass { Emp_Id = Emp_Id[i], Salary = Salary[i] });
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
我看到我的FData类可以像List一样使用,就好像它继承了所有可枚举的方法,如Select()、all()、Any()等。
我想知道如果这些方法的行为没有在接口中定义,这到底是怎么发生的?
所有这些方法都是实现IEnumerable
接口的类型的extension
方法。因此,一旦一个类型实现了IEnumerable
,就有这些方法作为方法——除了已经在类型体中定义的方法。
有关更多文档,请查看此处。此外,如果您以前没有听说过extension
方法,请先看看这里。
它们是扩展方法,下面是一些详细信息。
扩展方法作为静态方法存在于某个命名空间中的静态类中,该方法的第一个参数包括this
关键字(请参阅下面的OfType
的示例方法签名)。在这种情况下,您可能看到的是系统。林克。可枚举的扩展方法。如果要从类文件中删除using System.Linq
命名空间,那么这些扩展方法将不再可用。像Resharper这样的售后重构工具会在适当的时候建议扩展方法,但在Visual Studio中开箱即用的工具不会建议扩展方法(例如Ctrl+.)。因此,如果你想要它们,你必须确保在类文件的顶部添加适当的using
语句。如果您不需要它们,也不需要命名空间中的任何其他类,则可以将其删除,扩展方法将不再可用。
public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);
这样做的美妙之处在于,只要包含扩展方法的名称空间,任何实现IEnumerable
的方法都将具有可用的OfType
方法。您也可以制作自己的扩展方法。