【问题标题】:IEnumerable list through override chain通过覆盖链的 IEnumerable 列表
【发布时间】:2010-11-22 20:38:06
【问题描述】:

好的,很难为这个问题给出一个确切的标题,但这里是……我有一个名为 Block 的抽象类,它看起来像这样:

public abstract class Block
{
   public bool Enabled{get; private set;}

   public virtual IEnumerable<KeyValuePair<string, string>> GetDefaultUsages()
   {
      yield return new KeyValuePair<string, string>("Enabled", "true");
   }
}

说我有一个子类:

public class Form : Block
{
   public string Key{get; private set;}

   public override IEnumerable<KeyValuePair<string, string>> GetDefaultUsages()
   {
       yield return new KeyValuePair<string,string>("Key", string.Empty);

       // can't do: yield return base.GetDefaultUsages()
   }
}

这个想法是 GetDefaultUsages() 将始终返回一个 IEnumerable,其中包含通过整个继承链指定的所有字符串、字符串对。我最初希望 yield 关键字能够支持如下语句:

yield return (some IEnumerable<T> object);

但这显然行不通。我意识到我可以做到:

foreach(KeyValuePair<string, string> kv in base.GetDefaultUsages())
{
   yield return kv;
}

但我希望语法更简洁(并避免创建所有不必要的中间 IEnumerator)。

有人知道实现这个的好方法吗???

【问题讨论】:

标签: c# .net ienumerable


【解决方案1】:

您必须执行类似于 foreach 方法的操作,因为 base.GetDefaultUsages() 返回一个 IEnumerable。 yield return 处理单个项目,而不是集合。虽然如果yield return 可以返回一个对象集合就好了。

2 周前,John Oxley 询问了similar question

编辑: 似乎 Bart Jacobs、Eric Meyer、Frank Piessens 和 Wolfram Schulte 已经写了 a very interesting paper 的内容,内容是他们称之为嵌套迭代器的东西,这基本上就是您所要求的。

【讨论】:

  • 这不正是我在问题中所说的吗?
  • 是的,yield foreach 还没有。请参阅blogs.msdn.com/wesdyer/archive/2007/03/23/… 进行一些讨论
  • 是的,我的回答是确认您对问题的解决方案。到目前为止,枚举基本集合的 foreach 是解决方案。希望将来 C# 将支持使用 yield return 来返回集合。
  • 好吧,无论如何,感谢约翰奥克斯利问题的链接,那里有一些很好的材料
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2017-01-18
  • 2021-06-26
  • 1970-01-01
  • 2016-01-29
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多