c# - List 数组 排列 组合

11 篇文章 0 订阅

假设我们有以下x(3)个List(List1~3),每个List长度不固定,我们希望每次从这x(3)个List中各取一个值组合成一个x(3)个元素的数组,请打印出(返回)所有的可能:

using System.Collections.Generic;
using System.Linq;
using System;

namespace YourNameSpace
{
    class Program
    {
        static void Main(string[] args)
        {
            List<List<int>> listArray = new List<List<int>>()
            {
                new List<int>() { 0, 1, 2, 3 },
                new List<int>() { 0, 1 },
                new List<int>() { 0, 1, 2 },
            };

            var allCombinations = AllCombinationsOf(listArray);
            foreach (var combination in allCombinations)
            {
                Console.WriteLine(string.Join(", ", combination));
            }

            Console.ReadLine();
        }

        public static List<List<T>> AllCombinationsOf<T>(List<List<T>> sets)
        {
            var combinations = new List<List<T>>();

            foreach (var value in sets[0])
                combinations.Add(new List<T> { value });

            foreach (var set in sets.Skip(1))
                combinations = AddExtraSet(combinations, set);

            return combinations;
        }

        private static List<List<T>> AddExtraSet<T>
             (List<List<T>> combinations, List<T> set)
        {
            var newCombinations = from value in set
                                  from combination in combinations
                                  select new List<T>(combination) { value };

            return newCombinations.ToList();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值