首页 > 解决方案 > 方法如何返回 IEnumerable?

问题描述

假设我有以下方法,它接受一个 IEnumerable 并返回一个 IEnumerable。Linq 查询实际返回什么实现?IEnumerable 是一个接口,并且接口不能被实例化,所以在引擎盖下它必须在做某事。但是,如果您在返回后检查它,它看起来就像一个 IEnumerable,即使在运行时也是如此。

public IEnumerable<SelectListItem> CreateDropdownList(IEnumerable<Release> releases)
{
  return releases.Select(r => 
    new SelectListItem { 
      Value = r.UniqRelease.ToString(), 
      Text = r.DescriptionOf
  });
}

标签: c#linqienumerable

解决方案


使用接口的关键在于方法的用户无需担心实现。

但是当然有一个实现。在 LINQ 中,通常有一个扩展方法可以以通用方式处理任何集合。并且特定类型可能会选择创建一个了解集合内部工作的本地实现,从而实现更有效的实现。给定和数组它可能涉及跟踪索引。在链接的lidt中,它可能涉及“当前”指针并遵循“当前”上的“下一个”引用。

编译器甚至可以在给定 yield 语句的情况下为您创建实现。

关键是方法实现取决于类。


推荐阅读