当前位置:编程学习 > C#/ASP.NET >>

请教一下这个算法,该怎么写

一个List<List<int>>集合:

 List<List<int>> list_初始值 = new List<List<int>>() 
        { 
            new List<int>(){0,2,3},
            new List<int>(){1,7,4},
            new List<int>(){2,9,4},
        };

要求每个List<int>元素都提取一个元素进行组合,要按照"list_初始值"中元素顺序组合。要求得到一个List<List<int>>结果,最后的结果是这样的:

{0,1,2},{0,1,9},{0,1,4},{0,7,2},{0,7,9},{0,7,4},{0,4,2},{0,4,9},{0,4,4},
{2,1,2},{2,1,9},{2,1,4},{2,7,2},{2,7,9},{2,7,4},{2,4,2},{2,4,9},{3,4,4},
{3,1,2},{3,1,9},{3,1,4},{3,7,2},{3,7,9},{3,7,4},{3,4,2},{3,4,9},{3,4,4}

当然,最后的结果中,元素的顺序是不要求的,只是每个元素里面的小的元素必须要求顺序
请问,这个算法该怎么写啊?谢谢!!
--------------------编程问答-------------------- 就按你这个顺序吗?

var query = from t1 in list_初始值[0]
            from t2 in list_初始值[1]
            from t3 in list_初始值[2]
            select new
            {
                a = t1,
                b = t2,
                c = t3
            };

query.ToList().ForEach(x => { Console.WriteLine(x); });
--------------------编程问答--------------------
 List<List<String>> list0 = new List<List<String>>() 
        { 
            new List<String>(){"0","2","3"},
            new List<String>(){"1","7","4"},
            new List<String>(){"2","9","4"},
        };

         var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + t2).ToList()).ToList()).ToList();
--------------------编程问答-------------------- 楼上正解,牛叉 --------------------编程问答--------------------
public class A
{
    public int[] arr {get;set;}
}

public class B
{
    public A listA{get;set;}
}


 List<B> list_初始值 = new List<B>() 
        { 
            new int[3]{0,2,3},
            new int[3]{1,7,4},
            new int[3]{2,9,4},
        };
--------------------编程问答--------------------
引用 2 楼 wind_cloud2011 的回复:
 List<List<String>> list0 = new List<List<String>>() 
        { 
            new List<String>(){"0","2","3"},
            new List<String>(){"1","7","4"},
            new List<String>(){"2","9","4"},
        };

         var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + t2).ToList()).ToList()).ToList();

麻烦改一下,要求结果是List<List<String>>类型,比如字符串012改成{"0","1","2"} --------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼 caozhy 的回复:
List<List<int>> list_初始值 = new List<List<int>>() 
        { 
            new List<int>(){0,2,3},
            new List<int>(){1,7,4},
            new List<int>(){2,9,4},
        };
List<List<String>> result = (from x in list_初始值[0]
from y in list_初始值[1]
from z in list_初始值[2]
select new List<string>() { x.ToString(), y.ToString(), z.ToString() }).ToList();

能不能有个通用的方法,如果list_初始值的元素未知,该怎么写呢? --------------------编程问答--------------------
引用 5 楼 u013147242 的回复:
Quote: 引用 2 楼 wind_cloud2011 的回复:

 List<List<String>> list0 = new List<List<String>>() 
        { 
            new List<String>(){"0","2","3"},
            new List<String>(){"1","7","4"},
            new List<String>(){"2","9","4"},
        };

         var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + t2).ToList()).ToList()).ToList();

麻烦改一下,要求结果是List<List<String>>类型,比如字符串012改成{"0","1","2"}

 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + ","+t2).ToList()).ToList()).ToList(); --------------------编程问答--------------------
引用 7 楼 u013147242 的回复:
Quote: 引用 6 楼 caozhy 的回复:

List<List<int>> list_初始值 = new List<List<int>>() 
        { 
            new List<int>(){0,2,3},
            new List<int>(){1,7,4},
            new List<int>(){2,9,4},
        };
List<List<String>> result = (from x in list_初始值[0]
from y in list_初始值[1]
from z in list_初始值[2]
select new List<string>() { x.ToString(), y.ToString(), z.ToString() }).ToList();

能不能有个通用的方法,如果list_初始值的元素未知,该怎么写呢?


你若能结贴,可以为你写一个。 --------------------编程问答--------------------
引用 8 楼 wind_cloud2011 的回复:
 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + ","+t2).ToList()).ToList()).ToList();

不是这个意思,你的算法不错,但是得到的结果是List<String>类型的,我需要一个List<List<String>>类型的结果,比如得到的字符串结果012,要求是一个List<string>(){"0","1","2"},能不能再帮我修改下 --------------------编程问答-------------------- 这不就是笛卡尔乘积嘛。。。。。 --------------------编程问答--------------------
/// <summary>
        /// 获取相应的笛卡尔乘积组合,输入的是对象集合所对应的Count集合
        /// </summary>
        /// <param name="iList">要生成的对象索引集合,如:{3,2,1,5}</param>
        /// <returns>数组集合,每一个数组都对应一组索引集合</returns>
        public static List<int[]> GetCrossJoin(this IList<int> iList)
        {
            List<int[]> rList = null;
            int totalRows = 0;
            if (iList != null && iList.Count > 0)
            {
                totalRows = 1;
                foreach (int i in iList)
                {
                    totalRows *= i;
                }
            }

            if (totalRows != 0)
            {
                rList = new List<int[]>();
                for (int i = 0; i < totalRows; i++)
                {
                    rList.Add(new int[iList.Count]);
                }

                int repeatNum = totalRows;//该值表示批量内应该重复的次数
                int repeatPa;//表示批量执行次数,每个重复应该出现多少次
                int intervalNum;//表示每批重复应该有的间隔

                for (int i = 0; i < iList.Count; i++)
                {
                    repeatNum /= iList[i];
                    repeatPa = totalRows / repeatNum / iList[i];
                    intervalNum = repeatNum * iList[i];


                    for (int m = 0; m < repeatNum; m++)
                    {
                        for (int n = 0; n < repeatPa; n++)
                        {
                            for (int l = 0; l < iList[i]; l++)
                            {
                                rList[intervalNum * n + m + l * repeatNum][i] = l;
                            }
                        }
                    }
                }
            }

            return rList;
        }
--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 12 楼 starfd 的回复:
/// <summary>
        /// 获取相应的笛卡尔乘积组合,输入的是对象集合所对应的Count集合
        /// </summary>
        /// <param name="iList">要生成的对象索引集合,如:{3,2,1,5}</param>
        /// <returns>数组集合,每一个数组都对应一组索引集合</returns>
        public static List<int[]> GetCrossJoin(this IList<int> iList)
        {
            List<int[]> rList = null;
            int totalRows = 0;
            if (iList != null && iList.Count > 0)
            {
                totalRows = 1;
                foreach (int i in iList)
                {
                    totalRows *= i;
                }
            }

            if (totalRows != 0)
            {
                rList = new List<int[]>();
                for (int i = 0; i < totalRows; i++)
                {
                    rList.Add(new int[iList.Count]);
                }

                int repeatNum = totalRows;//该值表示批量内应该重复的次数
                int repeatPa;//表示批量执行次数,每个重复应该出现多少次
                int intervalNum;//表示每批重复应该有的间隔

                for (int i = 0; i < iList.Count; i++)
                {
                    repeatNum /= iList[i];
                    repeatPa = totalRows / repeatNum / iList[i];
                    intervalNum = repeatNum * iList[i];


                    for (int m = 0; m < repeatNum; m++)
                    {
                        for (int n = 0; n < repeatPa; n++)
                        {
                            for (int l = 0; l < iList[i]; l++)
                            {
                                rList[intervalNum * n + m + l * repeatNum][i] = l;
                            }
                        }
                    }
                }
            }

            return rList;
        }


......我觉得还是这个实惠,楼上那些大神写的linq的估计楼主看不懂 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 10 楼 u013147242 的回复:
Quote: 引用 8 楼 wind_cloud2011 的回复:

 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 + ","+t2).ToList()).ToList()).ToList();

不是这个意思,你的算法不错,但是得到的结果是List<String>类型的,我需要一个List<List<String>>类型的结果,比如得到的字符串结果012,要求是一个List<string>(){"0","1","2"},能不能再帮我修改下

    var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => t1 +","+ t2).ToList()).ToList()).ToList();
          List<String> list1 = new List<string>();
          foreach (string arr in array1)
          {
              list1.Add(arr);
          } --------------------编程问答--------------------

 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => "\"" + t1 + "\",\"" + t2 + "\"").ToList()).ToList()).ToList();
          List<String> list1 = new List<string>();
          foreach (string a in array1)
          {
              list1.Add(a.ToString().Replace("\"\"", "\""));              
          }
--------------------编程问答--------------------
引用 21 楼 wind_cloud2011 的回复:

 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => "\"" + t1 + "\",\"" + t2 + "\"").ToList()).ToList()).ToList();
          List<String> list1 = new List<string>();
          foreach (string a in array1)
          {
              list1.Add(a.ToString().Replace("\"\"", "\""));              
          }

没对啊,不是List<List<String>>类型的结果 --------------------编程问答--------------------
引用 12 楼 starfd 的回复:
/// <summary>
        /// 获取相应的笛卡尔乘积组合,输入的是对象集合所对应的Count集合
        /// </summary>
        /// <param name="iList">要生成的对象索引集合,如:{3,2,1,5}</param>
        /// <returns>数组集合,每一个数组都对应一组索引集合</returns>
        public static List<int[]> GetCrossJoin(this IList<int> iList)
        {
            List<int[]> rList = null;
            int totalRows = 0;
            if (iList != null && iList.Count > 0)
            {
                totalRows = 1;
                foreach (int i in iList)
                {
                    totalRows *= i;
                }
            }

            if (totalRows != 0)
            {
                rList = new List<int[]>();
                for (int i = 0; i < totalRows; i++)
                {
                    rList.Add(new int[iList.Count]);
                }

                int repeatNum = totalRows;//该值表示批量内应该重复的次数
                int repeatPa;//表示批量执行次数,每个重复应该出现多少次
                int intervalNum;//表示每批重复应该有的间隔

                for (int i = 0; i < iList.Count; i++)
                {
                    repeatNum /= iList[i];
                    repeatPa = totalRows / repeatNum / iList[i];
                    intervalNum = repeatNum * iList[i];


                    for (int m = 0; m < repeatNum; m++)
                    {
                        for (int n = 0; n < repeatPa; n++)
                        {
                            for (int l = 0; l < iList[i]; l++)
                            {
                                rList[intervalNum * n + m + l * repeatNum][i] = l;
                            }
                        }
                    }
                }
            }

            return rList;
        }

如果是字符串的,该怎么写呢?我试着修改,却没行 --------------------编程问答--------------------
引用 22 楼 u013147242 的回复:
Quote: 引用 21 楼 wind_cloud2011 的回复:


 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => "\"" + t1 + "\",\"" + t2 + "\"").ToList()).ToList()).ToList();
          List<String> list1 = new List<string>();
          foreach (string a in array1)
          {
              list1.Add(a.ToString().Replace("\"\"", "\""));              
          }

没对啊,不是List<List<String>>类型的结果

是List<String> --------------------编程问答--------------------
引用 24 楼 wind_cloud2011 的回复:
是List<String>

我需要一个List<List<string>>类型的结果,可不可以帮我改下 --------------------编程问答--------------------
引用 25 楼 u013147242 的回复:
Quote: 引用 24 楼 wind_cloud2011 的回复:

是List<String>

我需要一个List<List<string>>类型的结果,可不可以帮我改下

 var array1 = list0.Aggregate((m, n) => m.SelectMany(t1 => n.Select(t2 => "\"" + t1 + "\",\"" + t2 + "\"").ToList()).ToList()).ToList();
          List<String> list1 = new List<string>();
          foreach (string a in array1)
          {                  
              list1.Add(a.ToString().Replace("\"\"", "\""));
          }
          List<List<String>> list01 = new List<List<String>>();         
          list01.Add(list1);  --------------------编程问答--------------------
引用 23 楼 u013147242 的回复:
Quote: 引用 12 楼 starfd 的回复:

/// <summary>
        /// 获取相应的笛卡尔乘积组合,输入的是对象集合所对应的Count集合
        /// </summary>
        /// <param name="iList">要生成的对象索引集合,如:{3,2,1,5}</param>
        /// <returns>数组集合,每一个数组都对应一组索引集合</returns>
        public static List<int[]> GetCrossJoin(this IList<int> iList)
        {
            List<int[]> rList = null;
            int totalRows = 0;
            if (iList != null && iList.Count > 0)
            {
                totalRows = 1;
                foreach (int i in iList)
                {
                    totalRows *= i;
                }
            }

            if (totalRows != 0)
            {
                rList = new List<int[]>();
                for (int i = 0; i < totalRows; i++)
                {
                    rList.Add(new int[iList.Count]);
                }

                int repeatNum = totalRows;//该值表示批量内应该重复的次数
                int repeatPa;//表示批量执行次数,每个重复应该出现多少次
                int intervalNum;//表示每批重复应该有的间隔

                for (int i = 0; i < iList.Count; i++)
                {
                    repeatNum /= iList[i];
                    repeatPa = totalRows / repeatNum / iList[i];
                    intervalNum = repeatNum * iList[i];


                    for (int m = 0; m < repeatNum; m++)
                    {
                        for (int n = 0; n < repeatPa; n++)
                        {
                            for (int l = 0; l < iList[i]; l++)
                            {
                                rList[intervalNum * n + m + l * repeatNum][i] = l;
                            }
                        }
                    }
                }
            }

            return rList;
        }

如果是字符串的,该怎么写呢?我试着修改,却没行


这个传入和返回的都不是实际的数据集合,只是一个笛卡尔乘积对应的索引集合。。。跟数据类型是什么类型没有任何关系
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,