2

给定两个不同类型的 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 对其进行重构,但最终得到的结果没有明显的优势,而且似乎不太直观。此处的搜索显示了许多关于嵌套 foreachs 以迭代子属性的问题,但我找不到任何关于迭代两个不同列表的信息。

4

2 回答 2

1

我认为您的解决方案没有什么特别的问题。话虽如此,最简单的 LINQ 过程似乎是:

foreach(var entry in enumerable1.SelectMany(
            e => enumerable2.Select(e2 => new { First = e, Second = e2 })))
{
    DoSomething(entry.First, entry.Second);
}

鉴于它有点……迟钝……我建议坚持这两个foreach操作。这比 C# 编译器为了使该表达式工作而要经历的所有恶作剧要便宜(因为我们同时处理闭包和匿名类型)。

于 2010-04-20T21:13:18.010 回答
1

只要组合中没有重叠,我就看不到在两组的笛卡尔积上计算函数的计算效率更高的方法。但是,如果任何一个列表有重复的元素,或者 DoSomething 的参数顺序无关紧要并且列表中有重叠,您将产生对 DoSomething 的冗余调用。您可以通过记忆 DoSomething 来节省计算时间。

于 2010-04-20T21:20:18.480 回答