2

順列の問題を解決しようとしていますが、いくつかの問題があります。

いろいろなタイプのアイテムに合う「棚」があります。棚は位置が分かれており、アイテムには「サイズクラス」があり、棚自体にどれだけのスペースがあるかを示します。

最大4ポジションの棚に、 1ポジションのサイズクラスの(1,2,3,4)3アイテムのすべての充填の組み合わせを生成したいと思います。。(A,B,C)(eg. AAAA, AAAB, AAAC, BBBB, BBBA, ...)

次のステップでは、2つの位置を取るアイテムで順列を生成する必要があります。だから私は2つの位置(A,B,C)と1つの位置を生成する必要があります(D,E,F) (eg. AAD, AAE, ABD, ...)

私はここでこのライブラリを使用しようとしましたが、私の解決策は決して良いものではありません(そしてそれは2番目の例を解決しません)

using System;
using System.Linq;
using System.Collections.Generic;
using Facet.Combinatorics;

namespace iCombine
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            char[] inputSet = "ABCABCABCABC".ToCharArray ();
            IList<string> uniques = new List<string>(); 

            var combinations = new Combinations<char> (inputSet, 4, GenerateOption.WithoutRepetition);
            foreach (var combination in combinations) {
                var permutations = new Permutations<char> (combination, GenerateOption.WithoutRepetition);
                foreach (IList<char> permutation in permutations) {     
                    string token = new string (permutation.ToArray(), 0, 4);
                    if (!uniques.Contains(token))
                        uniques.Add(token);
                }
            }                   
        }
    }
}

どんな提案でも大歓迎です:)

4

1 に答える 1

3

これにより、最初の例の81の順列がすべて生成されます。

var items = new List<char>{'A', 'B', 'C'};

var perms = from a in items
            from b in items
            from c in items
            from d in items
            select new string(new char[]{a, b, c, d});

例えば

AAAA 
AAAB 
AAAC 
AABA 
AABB 
...

これは、2番目の例の27の順列です。

var items = new List<char>{'A', 'B', 'C'};
var items2 = new List<char> {'D', 'E', 'F'};

var perms = from a in items
            from b in items
            from c in items2
            select new string(new char[]{a, b, c});

同等のメソッド構文は、Enumerable.SelectManyを使用します。これは、シーケンスの各要素をに投影しIEnumerable<T>、結果のシーケンスを1つのシーケンスにフラット化します。

したがって、上記のクエリは次のように記述できます。

var items = new List<char> { 'A', 'B', 'C' };
var items2 = new List<char> { 'D', 'E', 'F' };

var perms = items.SelectMany(a => items, (a, b) => new { a, b })
            .SelectMany(t => items2, (t, c) => new string(new[] { t.a, t.b, c }));
于 2013-03-18T22:44:30.077 に答える