首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂循环c# -迭代每一列行以创建“配置”

复杂循环c# -迭代每一列行以创建“配置”
EN

Stack Overflow用户
提问于 2018-06-22 15:52:45
回答 1查看 983关注 0票数 0

我一直在试图为这些数据做一个循环的最佳途径。我有一个表,可以在下面看到,需要迭代所有列配置。列计数是动态的。结果应是:

苹果-西兰花-冰淇淋

苹果-西兰花-派

苹果-胡萝卜-冰淇淋

苹果-胡萝卜-派

苹果-豌豆-冰淇淋

苹果-豌豆派

苹果-青豆-冰淇淋

苹果-青豆-派

桔子-花椰菜-冰淇淋

桔子-花椰菜-派

橘子胡萝卜冰淇淋

橘子-胡萝卜-派

橙-豌豆-冰淇淋

橙-豌豆-派

橙子-青豆-冰淇淋

橙子-青豆-派

我的“手册”代码在下面,但我希望它对列更加动态(可能有2,3,5,等等)。

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

注意:我有一个对象“配置”和一个称为“信任”的对象列表。

配置表图像

代码语言:javascript
复制
List<Configuration> configs = new List<Configuration>();

// iterate left to right
for (int i1 = 0; i1 < dataGridConfigTable.Rows.Count - 1; i1++)
{
    string param1 = dataGridConfigTable.Rows[i1].Cells[0].Value.ToString() ?? string.Empty;

    if (!string.IsNullOrEmpty(param1))
    {
        for (int i2 = 0; i2 < dataGridConfigTable.Rows.Count - 1; i2++)
        {
            string param2 = dataGridConfigTable.Rows[i2].Cells[1].Value.ToString() ?? string.Empty;

            if (!string.IsNullOrEmpty(param2))
            {
                for (int i3 = 0; i3 < dataGridConfigTable.Rows.Count - 1; i3++)
                {
                    string param3 = dataGridConfigTable.Rows[i3].Cells[2].Value.ToString() ?? string.Empty;

                    if (!string.IsNullOrEmpty(param3))
                    {
                        for (int i4 = 0; i4 < dataGridConfigTable.Rows.Count - 1; i4++)
                        {
                            string param4 = dataGridConfigTable.Rows[i4].Cells[3].Value.ToString() ?? string.Empty;

                            if (!string.IsNullOrEmpty(param4))
                            {
                                for (int i5 = 0; i5 < dataGridConfigTable.Rows.Count - 1; i5++)
                                {
                                    string param5 = dataGridConfigTable.Rows[i5].Cells[4].Value.ToString() ?? string.Empty;

                                    if (!string.IsNullOrEmpty(param5))
                                    {
                                        configs.Add(new Configuration(param1, param2, param3, param4, param5));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 16:48:05

您正在寻找产生最终输出的笛卡尔积

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

代码语言:javascript
复制
    //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;
    }

您可以使用此方法将表转换为列表。

代码语言:javascript
复制
       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, "-");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50991595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档