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

在C#中,如何在嵌套的foreach循环中强制迭代IEnumerable?

发布时间:2020-12-15 23:39:02 所属栏目:百科 来源:网络整理
导读:我有两个IEnumerables: IEnumerablestring first = ...IEnumerablestring second = ... 我想创建第二个IEnumerable string这是每个IEnumerable的每个元素的串联. 例如: IEnumerablestring first = new [] {"a","b"};IEnumerablestring second = new [] {"c
我有两个IEnumerables:

IEnumerable<string> first = ...
IEnumerable<string> second = ...

我想创建第二个IEnumerable< string>这是每个IEnumerable的每个元素的串联.

例如:

IEnumerable<string> first = new [] {"a","b"};
IEnumerable<string> second = new [] {"c","d"};

foreach (string one in first)
{
   foreach (string two in second)
   {
      yield return string.Format("{0} {1}",one,two);
   }
}

这会产生:

“a c”; “广告”; “b c”; “b d”;

问题是,有时两个IEnumerables中的一个是空的:

IEnumerable<string> first = new string[0];
IEnumerable<string> second = new [] {"c","d"};

在这种情况下,嵌套的foreach构造永远不会到达yield return语句.当IEnumerable为空时,我希望结果只是非空IEnumerable的列表.

我怎样才能制作出我想要的组合?

编辑:
实际上,我有三个不同的IEnumerables我试图结合,所以添加如果空IEnumerable的每个可能的排列的条件似乎是坏的.如果这是唯一的方法,那么我想我必须这样做.

解决方法

即使没有项目,也只需使用Enumerable.DefaultIfEmpty()来枚举集合.

IEnumerable<string> first = new string[0]; 
IEnumerable<string> second = new[] { "a","b" };
IEnumerable<string> third = new[] { "c",null,"d" };

var permutations = 
     from one in first.DefaultIfEmpty()
     from two in second.DefaultIfEmpty()
     from three in third.DefaultIfEmpty()
     select String.Join(" ",NotEmpty(one,two,three));

注意:我使用String.Join连接非null或空的项以及选择要连接的非空项的方法(如果您不想使用单独的方法,可以内联此代码):

private static IEnumerable<string> NotEmpty(params string[] items)
{
    return items.Where(s => !String.IsNullOrEmpty(s));
}

以上样本的输出是

[ "a c","a","a d","b c","b","b d" ]

对于两个集合和foreach循环(虽然我会优先选择LINQ):

IEnumerable<string> first = new[] { "a","b" };
IEnumerable<string> second = new string[0];

foreach(var one in first.DefaultIfEmpty())
{
     foreach(var two in second.DefaultIfEmpty())
        yield return $"{one} {two}".Trim(); // with two items simple Trim() can be used
}

输出:

[ "a","b" ]

(编辑:李大同)

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

    推荐文章
      热点阅读