优雅地合并两个 IEnumerable

7
我有两个IEnumerable变量,两者都可以为空。我需要将它们合并成一个列表。这是一种直接的方法。
var ienumerable1 = GetEnumerable1(); 
var ienumerable2 = GetEnumerable2(); 

if(ienumerable1 != null){
   if(ienumerable2 != null){
      return ienumerable1.Union(ienumerable2);
   }
   return ienumerable1;
}
else{
   return ienumerable2;
}

有没有更简洁的方式,在少量代码行数内完成这个任务?

请查看以下网址:http://msdn.microsoft.com/zh-cn/library/system.linq.queryable.union(v=vs.110).aspx。 - TOP KEK
为什么这不被认为是优雅的呢?我认为没有更短更简单的方法来做到这一点。 - MakePeaceGreatAgain
什么定义了“更优雅”? - Patrick Hofman
7
你写的代码返回空枚举器,导致你的优雅度开始为负100分。无论你怎么做都只是在美化这个糟糕的情况,但你永远也无法使得分数高于零。解决真正的问题吧,一个返回空值的枚举器和一个返回null的枚举器在功能上是等价的。 - Hans Passant
1
这个问题似乎不适合在StackOverflow上讨论,因为它涉及到改进工作代码,这通常是StackOverflow的离题内容。这个问题可能更适合在CodeReview上讨论。 - Henry Keiter
显示剩余6条评论
2个回答

21

只需要检查是否为null,如果是null则赋值Enumerable.Empty。可以使用空合并运算符??来完成这一步操作。

var ienumerable1 = GetEnumerable1() ?? Enumerable.Empty<WhateverType>();
var ienumerable2 = GetEnumerable2() ?? Enumerable.Empty<WhateverType>(); 

return ienumerable1.Union(ienumerable2);

3
您可以编写自己的联合扩展,以在后台执行此替换操作。 - phoog

0
   var ienumerable1 = GetEnumerable1(); 
    var ienumerable2 = GetEnumerable2(); 
    return ienumerable1 != null
                    ? (ienumerable2 != null ? ienumerable1.Union(ienumerable2) : ienumerable1)
                    : ienumerable2;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接