鉴于两个不同类型的IEnumberables,迭代两个列表以对所有可能的组合执行操作的最佳实践(考虑可读性和可维护性)是什么?
我的初始解决方案是使用嵌套的foreach循环,迭代第一个IEnumerable,然后在该循环内,迭代第二个IEnumerable并将值从外部和当前循环传递到目标方法。例如:
enum ParamOne
{
First,
Second,
Etc
}
List<int> paramTwo = new List<int>() { 1, 2, 3 };
void LoopExample()
{
foreach (ParamOne alpha in Enum.GetValues(typeof(ParamOne)))
{
foreach (int beta in paramTwo)
{
DoSomething(alpha, beta);
}
}
}
我尝试用LINQ对其进行重组,但最终得到了一些没有明显优势且看起来不太直观的东西。这里的搜索显示了许多关于嵌套foreach以迭代子属性的问题,但是我找不到有关迭代两个不同列表的任何信息。
答案 0 :(得分:1)
我认为您的解决方案没有特别的错误。话虽这么说,最简单的LINQ程序似乎是:
foreach(var entry in enumerable1.SelectMany(
e => enumerable2.Select(e2 => new { First = e, Second = e2 })))
{
DoSomething(entry.First, entry.Second);
}
鉴于它有点......迟钝......我建议坚持两个foreach
操作。这比C#编译器为了使表达式工作而要经历的所有恶作剧都要便宜(因为我们同时处理闭包和匿名类型)。
答案 1 :(得分:1)
只要组合中没有重叠,我就没有看到在两组笛卡尔积上计算函数的计算效率更高的方法。但是,如果其中一个列表具有重复元素,或者DoSomething的参数顺序无关紧要且列表中存在重叠,则会生成对DoSomething的冗余调用。您可以通过记忆DoSomething来节省计算时间。