本组合类的实现,将任意 List<T> 装入组合类CombineFormat<T> 类中,
递归实现 索引非空组合;并按照索引器输出实际数据非空组合。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestSpace
{
/// <summary>
/// 组合类实现: 从N个元素中选出所有非空组合
/// </summary>
public class CombineFormat<T>
{
/// <summary>
/// 索引结果组合
/// </summary>
private List<List<int>> resData;
/// <summary>
/// 输入集合
/// </summary>
private List<T> srcData;
/// <summary>
/// 属性:结果组合
/// </summary>
public List<List<int>> ResData
{
get
{
return resData;
}
set
{
resData = value;
}
}
/// <summary>
/// 访问索引器:按照索引组合取实际数据
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public List<T> this[int index]
{
get
{
//存放实际数据的组合
List<T> indexData = new List<T>();
var comIndex = resData[index];
for (int i = 0; i < comIndex.Count; i++)
{
indexData.Add(srcData.ElementAt(comIndex[i]));
}
return indexData;
}
}
/// <summary>
/// 构造函数:必须传入集合
/// </summary>
/// <param name="data"></param>
public CombineFormat(List<T> srcdata)
{
this.srcData = srcdata;
ResData = new List<List<int>>();
}
/// <summary>
/// 选择项:从N个元素中选取M个元素
/// </summary>
/// <param name="m">选择M个</param>
private List<List<int>> SelectCombine(int n, int m)
{
List<List<int>> Result = new List<List<int>>();
List<int> temp;
//若是筛选1个则直接遍历一次即可
if (m == 1)
{
for (int i = 0; i < n; i++)
{
temp = new List<int>();
temp.Add(i);
Result.Add(temp);
}
return Result;
}
else//否则进行递归调用
{
List<List<int>> tempResult;
//倒序遍历
for (int i = n - 1; i >= 0; i--)
{
int num = i;
//递归调用
tempResult = SelectCombine(num, m - 1);
for (int j = 0; j < tempResult.Count; j++)
{
tempResult[j].Add(i);
}
Result.AddRange(tempResult);
}
}
return Result;
}
/// <summary>
/// 选择项:获取输入集合所有组合项
/// </summary>
public void GetCombines()
{
int length = srcData.Count;
for (int i = 1; i <= length; i++) //个数组合循环
{
var combines = this.SelectCombine(length, i);
ResData.AddRange(combines);
}
}
/// <summary>
/// 输出结果
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < resData.Count; i++)
{
sb.AppendFormat("[{0}]", string.Join(",", this[i].ToArray()));
}
sb.AppendLine();
for (int i = 0; i < resData.Count; i++)
{
sb.AppendFormat("[{0}]", string.Join(",", resData[i].ToArray()));
}
sb.AppendLine();
sb.AppendFormat("共有非空组合数{0}个!", resData.Count);
return sb.ToString();
}
}
}
功能调用:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestSpace
{
class Program
{
static void Main(string[] args)
{
//输入 a b c d 四个数据
var tesInput = "a b c d";
//转换为集合
List<string> range = new List<string>(tesInput.Split().ToArray());
//将集合装入组合类
CombineFormat<string> cbf = new CombineFormat<string>(range);
//调用组合筛选方法
cbf.GetCombines();
//输出结果:数据集合和索引集合
Console.WriteLine(cbf.ToString());
Console.ReadLine();
}
}
结果显示: