日期:2014-05-18  浏览次数:21003 次

如何使用C# 笛卡尔乘积达到这种效果
笛卡尔乘积地址:http://blog.sina.com.cn/s/blog_53e74b270100oaim.html

调用:
C# code

            List<string> allResult = new List<string>();
            string[] a = new string[] { "1", "2", "3" };
            string[] b = new string[] { "4"};
            string[] c = new string[] { "8", "9" };
            List<string[]> All = new List<string[]>();
            All.Add(a);
            All.Add(b);
            All.Add(c);
            Descartes(All, 0, allResult, string.Empty, "&");
            foreach (var item in allResult)
            {
                Response.Write(item + "<br />");
            }



方法:
C# code
private static string Descartes(List<string[]> ListArr, int Count, List<string> Result, string SourceData, string MergeChar)
        {
            string strTemp = SourceData;
            //获取当前数组
            string[] strArr = ListArr[Count];
            //循环当前数组
            foreach (var item in strArr)
            {
                if (Count + 1 < ListArr.Count)
                    strTemp += Descartes(ListArr, Count + 1, Result, item + MergeChar + SourceData, MergeChar);
                    Result.Add(SourceData + item);
            }
            return strTemp;
        }


现在输入的结果是:
HTML code

4&1&8
4&1&9
1&4
1
4&2&8
4&2&9
2&4
2
4&3&8
4&3&9
3&4
3




我希望的结果:(怎么修改可以达到这效查)

HTML code

1
2
3
4
8
9
1&4
1&8
1&9
2&4
2&8
2&9
3&4
3&8
3&9
1&4&8
1&4&9
2&4&8
2&4&9
3&4&8
3&4&9
4&8
4&9


像这样,每个值都遍历到一次

------解决方案--------------------
C# code

        private static string Descartes(List<string[]> ListArr, int Count, List<string> Result, string SourceData, string MergeChar)
        {

            if (SourceData == "1")
            {
                Console.WriteLine("");
            }
            //获取当前数组
            string[] strArr = ListArr[Count];
            //循环当前数组
            for (int i = Count; i < ListArr.Count; i++)
            {
                string[] tempStrArr = ListArr[i];
                foreach (string tempStr in tempStrArr)
                {

                    string strTemp = SourceData+tempStr;
                    Result.Add(strTemp);
                    if (i < ListArr.Count - 1)
                    {
                        Descartes(ListArr, i + 1, Result, strTemp, MergeChar);
                    }
                }
                
            }
            return "";
        }