c# - "yield return"更紧凑的方式?

标签 c# .net coding-style ienumerable yield-return

我有这个方法可以产生两种方法产生的值:

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是使用延迟执行来实现的,因此这不会提前评估您的枚举。

顺便说一下,Concatimplemented 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/

相关文章:

c# - 填充数据表并丢失第一行

c# - 使用 DataContractSerializer 序列化时缺少 XML 的末尾

.net - 自定义 .NET 数据提供程序

c# - 发生压缩后GC如何更新引用

java - for循环优化

c# - 使用名称中的参数调用函数

c# - 文本框控件中的验证问题

.net - 使用 SNMP 将文件从代理传输到管理器?

java - java中有没有更好的方法来遍历字符串?

仅在不存在时添加的 Java 命名约定