【问题标题】:Enumerating all combinations of lists of different types枚举不同类型列表的所有组合
【发布时间】:2010-04-21 05:29:23
【问题描述】:

给定两个不同类型的 IEnumberable,对两个列表进行迭代以对所有可能的组合执行操作的最佳实践是什么(考虑到可读性和可维护性)?

我最初的解决方案是使用嵌套的 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 以迭代子属性的问题,但我找不到任何关于迭代两个不同列表的信息。

【问题讨论】:

    标签: enumeration combinations


    【解决方案1】:

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

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

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

    【讨论】:

    • 这证实了我的结论——我提出的 LINQ 过程与你的基本相同,我同意它似乎比嵌套 foreach 循环更钝。
    • 另一方面,如果您需要过滤掉一些东西并获得 LINQ,那可能是一个胜利。
    • @BCS:显然我无法反驳这种说法,但我认为最好采用问题中提出的方案。否则,我们可以提出适合各种解决方案的假设情况确实没有限制。换句话说,我宁愿想出一个适合这个场景的解决方案,而不是一个适合这个解决方案的场景;)
    • 我遵循学派,一旦你回答了原作者的问题,就让答案对可能找到它的其他人更有用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多