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

标签 c#

我有两个 IEnumerable小号:

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"; "a d"; "b c"; "b d";

问题是,有时这两个 IEnumerable 之一s 为空:

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

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

如何生成我正在寻找的组合?

编辑: 实际上,我有三个不同的 IEnumerable s 我正在尝试组合,因此为空 IEnumerable 的每个可能排列添加 if 条件似乎很糟糕。如果那是唯一的方法,那么我想我将不得不那样做。

最佳答案

您可以简单地检查第一个可枚举不为空:

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

var firstList = first.ToList();

if (!firstList.Any()) {
    return second;
}

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

要消除正例中的双重 IEnumerable 评估,只需将第一个可枚举转换为列表

关于c# - 在 C# 中,如何在嵌套的 foreach 循环中强制迭代 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43740021/

相关文章:

c# - .NET - 将多个字符串值映射到 XmlEnumAttribute

C# 检查是否存在 USB 驱动器

c# - 表达树生成的IL是否经过优化?

c# - 如何在 Linq 左连接中使用常量值?

c# - 在 MVC 4 脚本部分初始化 jQuery DataTable 时隐藏表数据的最佳方法是什么

c# - 我可以将自定义版本字符串添加到 .net DLL 吗?

C#获取文件大小

c# - 根据类型和参数列表删除 ifs

c# - c# 中实现优先队列最快的集合是什么?

c# - iTextSharp 出现 "Specified method is not supported"错误