实现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接口

所有这些方法都是实现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方法。您也可以制作自己的扩展方法。

相关文章: