为了账号安全,请及时绑定邮箱和手机立即绑定

List <List <int >>的组合

List <List <int >>的组合

C#
杨__羊羊 2019-11-14 14:24:46
我有一个类型为List>的列表,其中包含List<int> A = new List<int> {1, 2, 3, 4, 5};List<int> B = new List<int> {0, 1};List<int> C = new List<int> {6};List<int> X = new List<int> {....,....};我想要这样的所有组合1-0-61-1-62-0-62-1-63-0-6等等。根据您的说法,可以使用Linq解决吗?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

这与我对另一个问题的回答非常相似:


var combinations = from a in A

                   from b in B

                   from c in C

                   orderby a, b, c

                   select new List<int> { a, b, c };


var x = combinations.ToList();

对于可变数量的输入,现在添加了泛型:


var x = AllCombinationsOf(A, B, C);


public static List<List<T>> AllCombinationsOf<T>(params List<T>[] sets)

{

    // need array bounds checking etc for production

    var combinations = new List<List<T>>();


    // prime the data

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

}


查看完整回答
反对 回复 2019-11-14
?
达令说

TA贡献1821条经验 获得超6个赞

如何使用.Join方法生成组合的方式呢?


static void Main()

{

    List<List<int>> collectionOfSeries = new List<List<int>>

                                {   new List<int>(){1, 2, 3, 4, 5},

                                    new List<int>(){0, 1},

                                    new List<int>(){6,3},

                                    new List<int>(){1,3,5}

                                };

    int[] result = new int[collectionOfSeries.Count];


    List<List<int>> combinations = GenerateCombinations(collectionOfSeries);


    Display(combinations); 

}

此方法GenerateCombinations(..)完成生成组合的主要工作。该方法是通用的,因此可用于生成任何类型的组合。


private static List<List<T>> GenerateCombinations<T>(

                                List<List<T>> collectionOfSeries)

{

    List<List<T>> generatedCombinations = 

        collectionOfSeries.Take(1)

                          .FirstOrDefault()

                          .Select(i => (new T[]{i}).ToList())                          

                          .ToList();


    foreach (List<T> series in collectionOfSeries.Skip(1))

    {

        generatedCombinations = 

            generatedCombinations

                  .Join(series as List<T>,

                        combination => true,

                        i => true,

                        (combination, i) =>

                            {

                                List<T> nextLevelCombination = 

                                    new List<T>(combination);

                                nextLevelCombination.Add(i);

                                return nextLevelCombination;

                            }).ToList();


    }


    return generatedCombinations;

}

显示助手


private static void Display<T>(List<List<T>> generatedCombinations)

{

    int index = 0;

    foreach (var generatedCombination in generatedCombinations)

    {

        Console.Write("{0}\t:", ++index);

        foreach (var i in generatedCombination)

        {

            Console.Write("{0,3}", i);

        }

        Console.WriteLine();

    }

    Console.ReadKey();

}


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 487 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信