在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的列表. 我怎样才能制作出我想要的组合? 编辑: 解决方法
即使没有项目,也只需使用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" ] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |