我有这个方法可以产生两种方法产生的值:
private IEnumerable<Node> ParseEmptyElement()
{
foreach (var node in ParseMembersOfObject())
{
yield return node;
}
foreach (var node in ParseNestedProperty())
{
yield return node;
}
}
对我来说,这似乎非常冗长。
是否有更好的方法来表达“从 MethodX 中生成所有值”,然后对 MethodY 执行相同的操作?
示例:
private IEnumerable<Node> ParseEmptyElement()
{
#yield all# items from ParseMembersOfObject();
#yield all# items from ParseNestedProperty();
}
我不想被迫将foreach 循环写入一行!但我也不想用大括号和所有东西编写成熟的 foreach 循环 :)
最佳答案
正如 Marc 评论的那样,这是等效的:
private IEnumerable<Node> ParseEmptyElement()
{
return ParseMembersOfObject().Concat(ParseNestedProperty());
}
Concat
是使用延迟执行来实现的,因此这不会提前评估您的枚举。
顺便说一下,Concat
是 implemented foreach
在一行上循环:
static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first,
IEnumerable<TSource> second) {
foreach (TSource element in first) yield return element;
foreach (TSource element in second) yield return element;
}
如果您不喜欢 Concat,并且仍然需要大括号,您仍然可以保留它们并更简洁地格式化代码:
private IEnumerable<Node> ParseEmptyElement()
{
foreach (var node in ParseMembersOfObject()) { yield return node; }
foreach (var node in ParseNestedProperty()) { yield return node; }
}
关于c# - "yield return"更紧凑的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810025/