1

私はリストを持っています

List<string> collection = {"a","b"}

数値、つまり重量、たとえば2を与えたい

私が欲しいのは:

与えられた重量について、可能なすべての組み合わせを取得します。

a0b0, a1b0, a2b0
a0b1, a1b1, a2b1
a0b2, a2b2

ここで、0,1,2は、0から指定された重み値までの値です。

私はそれを生成するのに苦労しています。案内してください?

4

3 に答える 3

3

考えられるすべての組み合わせが本当に必要な場合は、次を使用してください。

List<string> collection = new List<string> {"a","b"};
List<int> numbers = new List<int> { 0, 1, 2 };
var result = 
from a in collection
from b in collection
from n1 in numbers
from n2 in numbers
select a + n1 + b + n2;

これにより、36個のアイテムが生成されます:a0a0、a0a1、a0a2、a1a0、a1a1、a1a2、a2a0、a2a1、a2a2、a0b0、a0b1、a0b2、a1b0、a1b1、a1b2、a2b0、a2b1、a2b2、b0a0、b0 b1a1、b1a2、b2a0、b2a1、b2a2、b0b0、b0b1、b0b2、b1b0、b1b1、b1b2、b2b0、b2b1、b2b2

質問で述べた組み合わせのみが必要な場合は、次を使用してください。

List<int> numbers = new List<int> { 0, 1, 2 };
var result = 
from n1 in numbers
from n2 in numbers
select "a" + n1 + "b" + n2;

これにより、a0b0、a0b1、a0b2、a1b0、a1b1、a1b2、a2b0、a2b1、a2b2の9つのアイテムのみが生成されます。

于 2012-04-11T10:33:08.313 に答える
1

再帰の使用:

static void ShowCombination(List<string> mlist, int value,int current=0,string stringleft="")
    {
            if (current == mlist.Count-1) // if this is the last item in the list
            {
                for (int m = 0; m <= value; m++) //loop through the value add it to the existing string-stringleft
                {
                    Console.WriteLine(stringleft  + mlist[current]+m.ToString()); 
                }
            }
            else // if there are more than 1 item left in the list
            {
                string currentstring = mlist[current]; //get current string in the list eg. "a" 
                stringleft = stringleft + currentstring ; //reset existing string -- eg "a"
                for (int m = 0; m <= value; m++)  //loop through the value add it to the existing 'stringleft' pass it and the new current index for recursion
                {
                    string stopass = stringleft +  m.ToString(); // eg. "a0"; "a1" 
                    ShowCombination(mlist, value, current + 1, stopass); 
                }
            }
    }

ここに画像の説明を入力してください

使用法:

ShowCombination(new List<string>() {"a", "b"}, 2);

出力:

a0b0
a0b1
a0b2
a1b0
a1b1
a1b2
a2b0
a2b1
a2b2
于 2012-04-11T12:38:08.530 に答える
0

これは@Danielの答えにあまり追加せず、体重を動的にする方法と同じです。

int weight = 2;
List<string> collection1 = new List<string>{ "a", "b" };
var collection2 = Enumerable.Range(0, weight + 1);
var combinations=from str1 in collection1 
                 from int1 in collection2 
                 from str2 in collection1 
                 from int2 in collection2 
                 select str1 + int1 + str2 + int2;

foreach (var combi in combinations)
    Console.WriteLine(combi);

編集:すべての順列が必要な場合は、このプロジェクトを見て、どのように実装されているかを確認してください。それはうまく機能しています。

http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-CG

例えば:

List<string> collection1 = new List<string> { "a", "b", "c", "d" };
var collection2 = Enumerable.Range(0, weight + 1);
collection1 = collection1.Concat(collection2.Select(i => i.ToString())).ToList();

var permutations = new Facet.Combinatorics.Permutations<String>(collection1);
foreach (IList<String> p in permutations)
{
    String combi = String.Join("", p);
}
于 2012-04-11T10:56:14.147 に答える