gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:13:23 25 4
gpt4 key购买 nike

好吧,很难为这个问题说出一个确切的标题,但这里是......我有一个名为 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)。

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

最佳答案

您必须执行类似于 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关于他们称之为嵌套迭代器的东西,这基本上就是您所要求的。

关于c# - 通过覆盖链的 IEnumerable 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com