加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 通过覆盖链的IEnumerable列表

发布时间:2020-12-15 03:55:50 所属栏目:百科 来源:网络整理
导读:好的,很难说这个问题的确切标题,但这里…我有一个抽象的类叫做Block,看起来像这样: public abstract class Block{ public bool Enabled{get; private set;} public virtual IEnumerableKeyValuePairstring,string GetDefaultUsages() { yield return new Ke
好的,很难说这个问题的确切标题,但这里…我有一个抽象的类叫做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;
}

但是我希望有一个稍微清洁的语法(并避免创建所有不必要的中间IEnumerators).

任何人都有一个很好的方法实现这个想法?

解决方法

你必须像foreach方法那样做,因为base.GetDefaultUsages()返回一个IEnumerable.收益回报处理单项,而不是收藏.尽管如果yield返回可以返回一个对象的集合,那将是很好的.

2周前,约翰·奥克斯利(John Oxley)要求一个similar question.

编辑:
似乎Bart Jacobs,Eric Meyer,Frank Piessens和Wolfram Schulte已经写了a very interesting paper关于他们称之为嵌套迭代器的东西,这基本上是你要求的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读