/// <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;
}