枚举可能的组合泛型实现

/// <summary>
        /// 返回集合所有可能的组合数目
        /// </summary>
        /// <param name="count">集合的数目</param>
        /// <returns>组合的数目</returns>
        static int MakeObjectCount(int count)
        {
            if (count==1)
            {
                return 1;
            }
            else
            {
                return count * MakeObjectCount(count-1);
            }
        }

        /// <summary>
        /// 返回数组中所有可能的组合集合
        /// </summary>
        /// <typeparam name="T">集合的类型</typeparam>
        /// <param name="objects">待处理的集合</param>
        /// <returns>所有可能的组合集合</returns>
     public  static List<List<T>> MakeObject<T>(T[] objects)
        {
            System.Diagnostics.Contracts.Contract.Requires(objects.Length > 0 );

            List<List<T>> temp = new List<List<T>>(MakeObjectCount(objects.Length));
            if (objects.Length == 1)
            {
                var array = new List<T>();
                array.Add(objects[0]);
                temp.Add(array);
            }
            if (objects.Length == 2)
            {
                var arraya = new List<T>();
                var arrayb = new List<T>();
                arraya.Add(objects[0]);
                arraya.Add(objects[1]);
                arrayb.Add(objects[1]);
                arrayb.Add(objects[0]);
                temp.Add(arraya);
                temp.Add(arrayb);
            }
            else
            {
                for (int i = 0; i < objects.Length; i++)
                {
                    var newchar = new T[objects.Length - 1];
                    Array.Copy(objects, 1, newchar, 0, objects.Length - 1);
                    foreach (var item in MakeObject<T>(newchar))
                    {
                        item.Insert(0, objects[0]);
                        temp.Add(item);
                    }
                    T t = objects[0];
                    for (int o = 0; o < objects.Length; o++)
                    {
                        if (o == objects.Length - 1)
                        {
                            objects[o] = t;
                        }
                        else
                        {
                            objects[o] = objects[o + 1];
                        }
                    }
                }
            }
            return temp;
        }


 

猜你喜欢

转载自blog.csdn.net/pengdayong77/article/details/69017749