现有3组数,分别为:159,267,0348,分7种情况从这三组数中分别出号组成新的三位数,用数字1-7来表示每种出号方法:
1:代表159中任意出号1个,267中任意出号一个,0348中任意出号1个。如120,578,960等
2:代表159中任意出1,267中任意出2个或者159中任意出2个,267中任意出1个.如567,152等,或者其中之一出重码,如116,         577等。
3:代表159中任意出1,0348中任意出2个或者159中任意出2个,0348中任意出1个,如103,198等,或者其中之一出重码,如110,988等
4:代表267中任意出1,0348中任意出2个或者267中任意出2个,0348中任意出1个,如234,264等,或者其中之一出重码,如224,688等
5:代表159出3个或者出重码(含两位重码和三位重码),如159,115,155,999等
6:代表267出3个或者出重码(含两位重码和三位重码),如267,226,277,777等
7:代表0348中出3个或者出重码(含两位重码和三位重码),如034,048,003,448,888等除了定义三个数组,分别存放159,267,0348,再用N重N次for循环之外还有什么好招呢,请教大侠们真要for起来效率太低了这种情况类似于多个排列组合,2-4表示159,267,0348中任选两个进行组合,然后再任意其中一个任选1个或2个数字对应着另一组进行组合,5-7表示一组数字中任选1,2,3个进行组合组成一个三位数。

解决方案 »

  1.   

    如果考虑效率,linq的效率绝对不如for循环,
      

  2.   

    你要高手给你写linq,linq是简化代码,可读性我觉得你未必懂,而且性能方面基本没for快。
      

  3.   

    并非一定要用linq,主要是想以此抛砖引玉,该例子中只有三组数据,用for还有一定的可操作性,如果是100组数据呢?我觉得还是应该会有类似于排列组合的方法将其解答的
      

  4.   

    就这个问题来说用linq不存在效率降低的问题。规则比较多,也没有什么典型性,就不给代码了。lz可以根据我之前的回答的思路将你的规则一个一个写出就可以了。无非就是比较费事点。
      

  5.   

    private void button1_Click(object sender, EventArgs e)
            {
                int num1, num2, num3;
                Random rand = new Random();
                List<int> lst1 = new List<int>();
                lst1.Add(1);
                lst1.Add(5);
                lst1.Add(9);
                List<int> lst2 = new List<int>();
                lst2.Add(2);
                lst2.Add(6);
                lst2.Add(7);
                List<int> lst3 = new List<int>();
                lst3.Add(0);
                lst3.Add(3);
                lst3.Add(4);
                lst3.Add(8);
                switch (Convert.ToInt32(textBox1.Text))
                {
                    case 1:
                        {
                            num1 = lst1[rand.Next(1, 3) - 1];
                            num2 = lst2[rand.Next(1, 3) - 1];
                            num3 = lst3[rand.Next(1, 4) - 1];
                            MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
                            break;
                        }
                    case 2:
                        {
                            num1 = lst1[rand.Next(1, 3) - 1];
                            num2 = lst2[rand.Next(1, 3) - 1];
                            num3 = lst2[rand.Next(1, 3) - 1];
                            int num4, num5, num6;
                            num4 = lst1[rand.Next(1, 3) - 1];
                            num5 = lst2[rand.Next(1, 3) - 1];
                            num6 = lst2[rand.Next(1, 3) - 1];
                            List<string> lstTemp = new List<string>();
                            lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
                            lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
                            MessageBox.Show(lstTemp[rand.Next(1, 2)]);
                            break;
                        }
                    case 3:
                        {
                            // ...
                            break;
                        }
                    case 4:
                        {
                            // ...
                            break;
                        }
                    case 5:
                        {
                            // ...
                            break;
                        }
                    case 6:
                        {
                            // ...
                            break;
                        }
                    case 7:
                        {
                            // ...
                            break;
                        }
                    default: break;
                }
            }
      

  6.   

    呃,写错了一个
    case 2:
                        {
                            num1 = lst1[rand.Next(1, 3) - 1];
                            num2 = lst1[rand.Next(1, 3) - 1];
                            num3 = lst2[rand.Next(1, 3) - 1];
                            int num4, num5, num6;
                            num4 = lst1[rand.Next(1, 3) - 1];
                            num5 = lst2[rand.Next(1, 3) - 1];
                            num6 = lst2[rand.Next(1, 3) - 1];
                            List<string> lstTemp = new List<string>();
                            lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
                            lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
                            MessageBox.Show(lstTemp[rand.Next(1, 2)]);
                            break;
                        }
      

  7.   

    我写在WinForm里面的,请楼主自行调整
    static int num1, num2, num3;
            static Random rand = new Random();
            static List<int> lst1 = new List<int>();
            static List<int> lst2 = new List<int>();
            static List<int> lst3 = new List<int>();
            private void button1_Click(object sender, EventArgs e)
            {
                lst1.Add(1);
                lst1.Add(5);
                lst1.Add(9);
                lst2.Add(2);
                lst2.Add(6);
                lst2.Add(7);
                lst3.Add(0);
                lst3.Add(3);
                lst3.Add(4);
                lst3.Add(8);
                switch (Convert.ToInt32(textBox1.Text))
                {
                    case 1:
                        {
                            Show1();
                            break;
                        }
                    case 2:
                        {
                            Show2();
                            break;
                        }
                    case 3:
                        {
                            Show3();
                            break;
                        }
                    case 4:
                        {
                            Show4();
                            break;
                        }
                    case 5:
                        {
                            Show5();
                            break;
                        }
                    case 6:
                        {
                            Show6();
                            break;
                        }
                    case 7:
                        {
                            Show7();
                            break;
                        }
                    default: break;
                }
            }        private static void Show1()
            {
                num1 = GetFromListByListNum(1);
                num2 = GetFromListByListNum(2);
                num3 = GetFromListByListNum(3);
                MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
            }
            private static void Show2()
            {
                num1 = GetFromListByListNum(1);
                num2 = GetFromListByListNum(2);
                num3 = GetFromListByListNum(2);
                int num4, num5, num6;
                num4 = GetFromListByListNum(1);
                num5 = GetFromListByListNum(1);
                num6 = GetFromListByListNum(2);
                List<string> lstTemp = new List<string>();
                lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
                lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
                MessageBox.Show(lstTemp[rand.Next(0, 2)]);
            }
            private static void Show3()
            {
                num1 = GetFromListByListNum(1);
                num2 = GetFromListByListNum(3);
                num3 = GetFromListByListNum(3);
                int num4, num5, num6;
                num4 = GetFromListByListNum(1);
                num5 = GetFromListByListNum(1);
                num6 = GetFromListByListNum(3);
                List<string> lstTemp = new List<string>();
                lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
                lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
                MessageBox.Show(lstTemp[rand.Next(0, 2)]);
            }
            private static void Show4()
            {
                num1 = GetFromListByListNum(2);
                num2 = GetFromListByListNum(3);
                num3 = GetFromListByListNum(3);
                int num4, num5, num6;
                num4 = GetFromListByListNum(2);
                num5 = GetFromListByListNum(2);
                num6 = GetFromListByListNum(3);
                List<string> lstTemp = new List<string>();
                lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
                lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
                MessageBox.Show(lstTemp[rand.Next(0, 2)]);
            }
            private static void Show5()
            {
                num1 = GetFromListByListNum(1);
                num2 = GetFromListByListNum(1);
                num3 = GetFromListByListNum(1);
                MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
            }
            private static void Show6()
            {
                num1 = GetFromListByListNum(2);
                num2 = GetFromListByListNum(2);
                num3 = GetFromListByListNum(2);
                MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
            }
            private static void Show7()
            {
                num1 = GetFromListByListNum(3);
                num2 = GetFromListByListNum(3);
                num3 = GetFromListByListNum(3);
                MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
            }        // 表示从第几个组里抽随机数
            private static int GetFromListByListNum(int listNum)
            {
                switch (listNum)
                {
                    case 1:
                        return lst1[rand.Next(0, 3)];
                    case 2:
                        return lst2[rand.Next(0, 3)];
                    case 3:
                        return lst3[rand.Next(0, 4)];
                    default:
                        return 0;
                }
            }
      

  8.   

    另一种实现方法,楼主看注释
    // 楼主的七种排列是有规律的,假设三个数组的组号分别为1,2,3,那么排出的肯定是111,123,133这些,总之不会出现211,321这种前面的组号比后面的组号大的情况,如果是从七种中随机抽一种的话,可以精简成这样,下面的算法包括了楼主所有可能出现的排列中会出现的数字组合
            private static List<int> lst1 = new List<int>();
            private static List<int> lst2 = new List<int>();
            private static List<int> lst3 = new List<int>();
            private static Random rand = new Random();
            private static int max = 1;// 用来记录当前组号
            private void button1_Click(object sender, EventArgs e)
            {
                max = 1;// 每按一次按钮就重置一次数字
                lst1.Add(1);
                lst1.Add(5);
                lst1.Add(9);
                lst2.Add(2);
                lst2.Add(6);
                lst2.Add(7);
                lst3.Add(0);
                lst3.Add(3);
                lst3.Add(4);
                lst3.Add(8);
                ShowResault();
            }        private static void ShowResault()
            {            int num1 = GetFromListByListNum();
                int num2 = GetFromListByListNum();
                int num3 = GetFromListByListNum();
                MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
            }
            // 表示从第几个组里抽随机数
            private static int GetFromListByListNum()
            {
                max = rand.Next(max, 4);// 这里就是实现后面的组号比前面的组号小的关键地方,前一个数字所在的组号总是比后一个数字所在的组号小,假设第一个组号为2,那么后面的两个只会是2或3,而不会出现1,即只会出现222,223,233的情况
                switch (max)
                {
                    case 1:
                        return lst1[rand.Next(0, 3)];
                    case 2:
                        return lst2[rand.Next(0, 3)];
                    case 3:
                        return lst3[rand.Next(0, 4)];
                    default:
                        throw new Exception("没有这个组。");
                }
            }
      

  9.   

    代码有点错,因为用到了静态变量,所以要改成只在第一次添加就行了。多加一个布尔字段用来判断
    private static bool added = false;// 表示列表里是否已添加有数据,如果有,则不再添加
            private void button1_Click(object sender, EventArgs e)
            {
                max = 1;// 每按一次按钮就重置一次数字
                if (!added)// 只在第一次添加
                {
                    lst1.Add(1);
                    lst1.Add(5);
                    lst1.Add(9);
                    lst2.Add(2);
                    lst2.Add(6);
                    lst2.Add(7);
                    lst3.Add(0);
                    lst3.Add(3);
                    lst3.Add(4);
                    lst3.Add(8);
                    added = true;
                }            ShowResault();
            }
      

  10.   

    // 针对楼主可能出现3个以上数组的情况,多加入一个lst用来存储数组,但是数据得楼主自行添加新的List,还有就是下面的switch语句楼主得自行添加剩下的数组的case情况
            // 楼主的七种排列是有规律的,假设三个数组的组号分别为1,2,3,那么排出的肯定是111,123,133这些,总之不会出现211,321这种前面的组号比后面的组号大的情况,如果是从七种中随机抽一种的话,可以精简成这样,下面的算法包括了楼主所有可能出现的排列中会出现的数字组合        /// <summary>
            /// 用来存储数组 
            /// </summary>
            private static List<List<int>> lst = new List<List<int>>();
            /// <summary>
            /// 第一组数据 
            /// </summary>
            private static List<int> lst1 = new List<int>();
            /// <summary>
            /// 第二组数据
            /// </summary>
            private static List<int> lst2 = new List<int>();
            /// <summary>
            /// 第三组数据
            /// </summary>
            private static List<int> lst3 = new List<int>();
            /// <summary>
            /// 用于随机抽取数字
            /// </summary>
            private static Random rand = new Random();
            /// <summary>
            /// // 用来记录当前组号
            /// </summary>
            private static int max = 1;
            /// <summary>
            /// 表示列表里是否已添加有数据,如果有,则不再添加
            /// </summary>
            private static bool added = false;
            /// <summary>
            /// 用来存储组合数字
            /// </summary>
            private static StringBuilder sb = new StringBuilder();        /// <summary>
            /// 单击按钮事件,以便显示抽取出来的组合数字
            /// </summary>
            /// <param name="sender">sender</param>
            /// <param name="e">e</param>
            private void button1_Click(object sender, EventArgs e)
            {
                max = 1;// 每按一次按钮就重置一次数字            if (!added)// 只在第一次添加
                {
                    // 将数组装入列表
                    lst.Add(lst1);
                    lst.Add(lst2);
                    lst.Add(lst3);                // 将第一组数据装入列表作为数组
                    lst1.Add(1);
                    lst1.Add(5);
                    lst1.Add(9);                // 将第二组数据装入列表作为数组
                    lst2.Add(2);
                    lst2.Add(6);
                    lst2.Add(7);                // 将第三组数据装入列表作为数组
                    lst3.Add(0);
                    lst3.Add(3);
                    lst3.Add(4);
                    lst3.Add(8);
                    added = true;// 将布尔值设为true,表示数据初始化完毕
                }            ShowResault();// 显示结果
            }        /// <summary>
            /// 显示结果
            /// </summary>
            private static void ShowResault()
            {
                if (sb.Length > 0)
                {
                    sb.Clear();// 清空,以便重用
                }
                for (int i = 0; i < lst.Count; i++)
                {
                    sb.Append(GetNumberFromList());
                }
                MessageBox.Show(sb.ToString());
            }        /// <summary>
            /// 表示从第几个组里抽随机数
            /// </summary>
            /// <returns>随机数</returns>
            private static int GetNumberFromList()
            {
                max = rand.Next(max, lst.Count + 1);// 这里就是实现后面的组号比前面的组号小的关键地方,前一个数字所在的组号总是比后一个数字所在的组号小,假设第一个组号为2,那么后面的两个只会是2或3,而不会出现1,即只会出现222,223,233的情况
                // 如果还有别的数组,请楼主自行添加case
                switch (max)
                {
                    case 1:
                        return lst1[rand.Next(0, 3)];
                    case 2:
                        return lst2[rand.Next(0, 3)];
                    case 3:
                        return lst3[rand.Next(0, 4)];
                    default:
                        throw new Exception("没有这个组。");
                }
            }