C# 复杂for循环c-迭代每个列行以创建“配置”

C# 复杂for循环c-迭代每个列行以创建“配置”,c#,for-loop,combinatorics,C#,For Loop,Combinatorics,我一直在想最好的方法来循环这些数据。我有一个表,可以在下面看到,需要遍历所有列配置。列计数是动态的。结果应该是: 苹果花椰菜冰淇淋 苹果花椰菜派 苹果胡萝卜冰淇淋 苹果胡萝卜派 苹果豆冰淇淋 苹果豌豆派 苹果绿豆冰淇淋 苹果绿豆馅饼 桔子花椰菜冰淇淋 桔子花椰菜派 橙色胡萝卜冰淇淋 橙色胡萝卜派 橙色豌豆冰淇淋 橘子豌豆馅饼 橙绿豆冰淇淋 橙青豆馅饼 我的手动代码如下,但我希望它更动态关于列可能有2,3,5等 当列发生变化时,创建动态循环的最佳方法是什么 注意:我有一个对象配置和一个名为conf

我一直在想最好的方法来循环这些数据。我有一个表,可以在下面看到,需要遍历所有列配置。列计数是动态的。结果应该是:

苹果花椰菜冰淇淋 苹果花椰菜派 苹果胡萝卜冰淇淋 苹果胡萝卜派 苹果豆冰淇淋 苹果豌豆派 苹果绿豆冰淇淋 苹果绿豆馅饼 桔子花椰菜冰淇淋 桔子花椰菜派 橙色胡萝卜冰淇淋 橙色胡萝卜派 橙色豌豆冰淇淋 橘子豌豆馅饼 橙绿豆冰淇淋 橙青豆馅饼

我的手动代码如下,但我希望它更动态关于列可能有2,3,5等

当列发生变化时,创建动态循环的最佳方法是什么

注意:我有一个对象配置和一个名为configs的对象列表

配置表的图像

您正在寻找生成最终输出的方法

因此,首先将表或数据源转换为字符串列表,然后将笛卡尔乘积应用于集合中的每个列表

    //this function produce the cartesian product of two lists
    List<string> CartesianProduct(List<string> lst1, List<string> lst2, string seperator)
    {
        var res = new List<string>();
        for (int i = 0; i < lst1.Count; i++)
        {
            for (int j = 0; j < lst2.Count; j++)
            {
                res.Add(lst1[i] + seperator + lst2[j]);
            }
        }
        return res;
    }

    //This function apply the cartesian product to all lists
    List<string> CartesianProduct(List<List<string>> lsts, string seperator)
    {
        List<string> res = lsts[0];

        for (int i = 1; i < lsts.Count; i++)
        {
            res = CartesianProduct(res, lsts[i], seperator);
        }
        return res;
    }
您可以使用此方法将表转换为列表

       var dt1 = new DataTable(); //your data source
        var lsts = new List<List<string>>();

        for (int i = 0; i < dt1.Columns.Count; i++)
        {
            var singleColumnLst = new List<string>();
            for (int j = 0; j < dt1.Rows.Count; j++)
            {
                singleColumnLst.Add((string)dt1.Rows[i][j]);
            }
            lsts.Add(singleColumnLst);
        }

        //final results
        var allItems = CartesianProduct(lsts, "-");

反转ifs并根据需要使用continue或break来减少嵌套。这太多嵌套了。10标识和分支的级别肯定需要重构。你忘了问一个问题。@Amy不是吗?我希望[for loops]在列方面更加动态,足以让你知道OP想要什么?抱歉!完全忘记了。我刚刚编辑了这个问题,但我想知道是否有一种方法可以使这个动态的列数量变化。谢谢太好了,谢谢!有没有办法将输出放入数组列表中?例如[Apple,Brocoli,Ice Cream]Sure@SeanSullivan,您可以创建一个空数组列表,并在您选择的分隔符上拆分最终结果allItems中的每个项目,然后将数组添加到您创建的列表中。
       var dt1 = new DataTable(); //your data source
        var lsts = new List<List<string>>();

        for (int i = 0; i < dt1.Columns.Count; i++)
        {
            var singleColumnLst = new List<string>();
            for (int j = 0; j < dt1.Rows.Count; j++)
            {
                singleColumnLst.Add((string)dt1.Rows[i][j]);
            }
            lsts.Add(singleColumnLst);
        }

        //final results
        var allItems = CartesianProduct(lsts, "-");