实现IEnumerable接口

时间:2014-04-13 22:09:03

标签: c# interface

我知道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()等。

我想知道如果界面中没有定义这些方法的行为,究竟会发生什么?

2 个答案:

答案 0 :(得分:7)

对于实现extension接口的类型,所有这些方法都是IEnumerable方法。因此,一旦类型实现IEnumerable具有方法,这些方法 - 除了方法之外,已经在类型的主体内定义了。

如需进一步的文档,请查看here。另外,如果您之前没有听说过extension方法,请先查看here

答案 1 :(得分:2)

它们是扩展方法,而且还有更多信息。

扩展方法在某些命名空间内的静态类中作为静态方法存在,并且该方法的第一个参数包含this关键字(请参阅OfType下面的示例方法签名)。在这种情况下,您可能会看到System.Linq.Enumerable extension methods。如果要从类文件中删除using System.Linq命名空间,则这些扩展方法将不再可用。在像Resharper这样的市场重构工具之后会建议适当的扩展方法,但是你在Visual Studio中开箱即用的方法不会建议扩展方法(例如Ctrl +。)。因此,如果您需要它们,则必须确保在类文件的顶部添加适当的using语句。如果您不想要它们并且不需要命名空间中的任何其他类,则可以将其删除,并且扩展方法将不再可用。

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);

这样做的好处是,只要包含该扩展方法的名称空间,任何实现IEnumerable的方法都将具有OfType方法。您也可以制作自己的扩展方法。