none
当要排列组合的内容个数不定时,如何写成通用的算法??? RRS feed

  • 问题

  •  public partial class WebForm9 : System.Web.UI.Page
        {
            List<List<string>> list = new List<List<string>>() { 
            new List<string>{"A","B","C"},
            new List<string>{"D","E","F"},
            new List<string>{"G","H","I"},
            new List<string>{"J","K","L"}
            };
            protected void Page_Load(object sender, EventArgs e)
            {
                int i = 0;
                foreach (string s1 in list[0])
                {
                    foreach (string s2 in list[1])
                    {
                        foreach (string s3 in list[2])
                        {
                            foreach (string s4 in list[3])
                            {
                                TextBox1.Text += string.Format("{0} {1} {2} {3} {4}",s1,s2,s3,s4,"\r\n");
                                i++;
                            }
                        }
                    }
                }
                TextBox1.Text += i.ToString();
            }
        }

    如何将此例写成动态算法,即:List<List<string>> list的个数不定时,写成通用的算法???

    当list的个数为2个时,用2个foreach嵌套,当个数为3个时,用3个foreach嵌套,,当个数为4个时,用4个foreach嵌套,这该如何写成通用的???

    • 已编辑 xzzyyx8 2016年5月3日 2:56 修改
    2016年5月3日 2:53

答案

  • List<List<string>> list = new List<List<string>>() { 
            new List<string>{"A","B","C"},
            new List<string>{"D","E","F"},
            new List<string>{"G","H","I"},
            new List<string>{"J","K","L"}
            };
            protected void Page_Load(object sender, EventArgs e)
            {
                abc(list);
            }

    private void abc(List<List<string>> lt)
            {
                int j = 0;
                int[] iA = new int[lt.Count];
                while (iA[0] < lt[0].Count)
                {
                    for (int i = 0; i < lt.Count; i++)
                    {
                        TextBox1.Text += string.Format("{0}",lt[i][iA[i]]);
                    }
                    j++;
                    TextBox1.Text += "\r\n";
                    iA[lt.Count - 1]++;
                    for (int k = iA.Length - 1; k > 0; k--)
                    {
                        if (iA[k] == lt[k].Count)
                        {
                            iA[k] = 0;
                            iA[k - 1]++;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                TextBox1.Text += j.ToString();
            }

    • 已标记为答案 xzzyyx8 2016年5月3日 7:36
    2016年5月3日 7:36
  • List<List<string>> list = new List<List<string>>() 
                { 
                    new List<string>{"A","B","C"},
                    new List<string>{"D","E","F"},
                    new List<string>{"G","H","I"},
                    new List<string>{"J","K","L"}
                };
                int times = 0;
                string result = fun(0, list, string.Empty,ref times);
                
                Console.WriteLine("{0}{1}\r\n{2}",result, result.Split(new char[]{'\r','\n', '\t'}, StringSplitOptions.RemoveEmptyEntries).Count(), times);
    
    private string fun(int i, List<List<string>> list, string r,ref int times) {
                ++times;
                List<string> s = list.ElementAtOrDefault(i);
                string result = string.Empty;
                if (s == null) return string.Empty;
                var next = list.ElementAtOrDefault(i + 1);
                if (next == null)
                {
                    foreach (var x in s)
                    {
                        result += r + x + "\t";
                    }
                    result += "\r\n";
                }
                else
                {
                    foreach (var x in s)
                    {
                        result += fun(i + 1, list, r + x,ref times);
                    }
                }
                return result;
            }

    • 已标记为答案 xzzyyx8 2016年5月7日 13:28
    2016年5月3日 10:52

全部回复

  • List<List<string>> list = new List<List<string>>() { 
            new List<string>{"A","B","C"},
            new List<string>{"D","E","F"},
            new List<string>{"G","H","I"},
            new List<string>{"J","K","L"}
            };
            protected void Page_Load(object sender, EventArgs e)
            {
                abc(list);
            }

    private void abc(List<List<string>> lt)
            {
                int j = 0;
                int[] iA = new int[lt.Count];
                while (iA[0] < lt[0].Count)
                {
                    for (int i = 0; i < lt.Count; i++)
                    {
                        TextBox1.Text += string.Format("{0}",lt[i][iA[i]]);
                    }
                    j++;
                    TextBox1.Text += "\r\n";
                    iA[lt.Count - 1]++;
                    for (int k = iA.Length - 1; k > 0; k--)
                    {
                        if (iA[k] == lt[k].Count)
                        {
                            iA[k] = 0;
                            iA[k - 1]++;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                TextBox1.Text += j.ToString();
            }

    • 已标记为答案 xzzyyx8 2016年5月3日 7:36
    2016年5月3日 7:36
  • List<List<string>> list = new List<List<string>>() 
                { 
                    new List<string>{"A","B","C"},
                    new List<string>{"D","E","F"},
                    new List<string>{"G","H","I"},
                    new List<string>{"J","K","L"}
                };
                int times = 0;
                string result = fun(0, list, string.Empty,ref times);
                
                Console.WriteLine("{0}{1}\r\n{2}",result, result.Split(new char[]{'\r','\n', '\t'}, StringSplitOptions.RemoveEmptyEntries).Count(), times);
    
    private string fun(int i, List<List<string>> list, string r,ref int times) {
                ++times;
                List<string> s = list.ElementAtOrDefault(i);
                string result = string.Empty;
                if (s == null) return string.Empty;
                var next = list.ElementAtOrDefault(i + 1);
                if (next == null)
                {
                    foreach (var x in s)
                    {
                        result += r + x + "\t";
                    }
                    result += "\r\n";
                }
                else
                {
                    foreach (var x in s)
                    {
                        result += fun(i + 1, list, r + x,ref times);
                    }
                }
                return result;
            }

    • 已标记为答案 xzzyyx8 2016年5月7日 13:28
    2016年5月3日 10:52
  • 谢谢楼上的朋友!
    2016年5月7日 13:28
  • class MainClass
    {
        static List<List<string>> list = new List<List<string>> () { 
            new List<string>{ "A", "B", "C" },
            new List<string>{ "D", "E", "F" },
            new List<string>{ "G", "H", "I" },
            new List<string>{ "J", "K", "L" }
        };
    
        public static void Main (string[] args)
        {
            var result = GetSuffixStrList (list, 0);
            result.ForEach (line => Console.WriteLine (line));
        }
    
        private static List<string> GetSuffixStrList (List<List<string>> init, int currentRow)
        {
            List<string> result = new List<string> ();
            List<string> suffixStrList;
            if (currentRow < init.Count - 1) {
                suffixStrList = GetSuffixStrList (init, currentRow + 1);
            } else {
                return init [currentRow];
            }
            foreach (var i in init[currentRow])
                foreach (var suffixStr in suffixStrList)
                    result.Add (i + suffixStr);
            return result;
        }
    
    }
    简单的递归就可以咯
    <embed height="0" id="xunlei_com_thunder_helper_plugin_d462f475-c18e-46be-bd10-327458d045bd" type="application/thunder_download_plugin" width="0" />
    • 已编辑 Su, Yuxuan 2016年5月11日 13:19 修改
    2016年5月11日 13:18