算法很简答,就是迭代计算,得到所有组合就行了,废话不多说,直接上代码(看起来复杂,实现起来代码其实很简单)
/// <summary>
/// 从dataList中提取n个数,得到所有组合(数字可重复)
/// </summary>
/// <param name="dataList">数据集合</param>
/// <param name="n">提取数字数量</param>
/// <param name="value">默认为null,迭代时使用</param>
/// <returns></returns>
private static List<List<int>> GetCombinations(List<int> dataList, int n, List<int> value = null)
{
List<List<int>> result = new List<List<int>>();
for (int i = 0, count = dataList.Count; i < count; i++)
{
List<int> itemList = new List<int>();
if (value != null && value.Count > 0)
{
itemList.AddRange(value);
}
itemList.Add(dataList[i]);
if (itemList.Count == n)
{
result.Add(itemList);
}
else
{
result.AddRange(GetCombinations(dataList, n, itemList));
}
}
return result;
}
static void Main(string[] args)
{
List<int> IntArr = new List<int>() { 1, 2, 3, 4, 5 }; //整型数组
List<List<int>> ListCombination = GetCombinations(IntArr, 3); //从中提取3个数,返回所有组合
foreach (List<int> arr in ListCombination)
{
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine("");
}
Console.ReadKey();
}