组合类递归实现c#

本组合类的实现,将任意 List<T> 装入组合类CombineFormat<T> 类中,
递归实现 索引非空组合;并按照索引器输出实际数据非空组合。


CombineFormat<T> .cs

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();
        }
}

结果显示:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值