【问题标题】:Implementing IEnumerable Interface实现 IEnumerable 接口
【发布时间】:2014-04-13 22:09:03
【问题描述】:

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

我想知道如果这些方法的行为没有在接口中定义,这到底是怎么发生的?

【问题讨论】:

    标签: c# interface


    【解决方案1】:

    所有这些方法都是extension 方法,用于实现IEnumerable 接口的类型。因此,一旦一个类型实现了IEnumerable,这些方法也将作为方法——除了那些已经在你的类型主体中定义的方法。

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

    【讨论】:

    • 这里没有扩展方法。
    • @JonHanna 你是什么意思?
    • 我的意思是,您的回答谈到了扩展方法,以及指向扩展方法描述的链接,但它们与问题无关。
    • 我完全明白那里发生了什么,非常感谢您的回答。
    • 是的,当我得了流感时,我不应该费心去看这个网站。我现在要读一些网络漫画 :)
    【解决方案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 方法。您也可以制作自己的扩展方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多