2

私はサブルーチンを持っています:

private static IEnumerable<IEnumerable<T>> permutations<T>(IEnumerable<T> source)
{
    var c = source.Count();
    if (c == 1)
        yield return source;
    else
        for (int i = 0; i < c; i++)
            foreach (var p in permutations(source.Take(i).Concat(source.Skip(i + 1))))
                yield return source.Skip(i).Take(1).Concat(p);
    }

それでは、main関数でそれを呼び出す方法は?

static void Main(string[] args)
{
    string input = "abcdefghijk";
    IEnumerable<string> summary;
    summary= permutations<string>(IEnumerable<string> input);// obviously wrong, but how??
}
4

5 に答える 5

3

関数の呼び出しは簡単です。必要なのは次のとおりです。

permutations(input)

これにより、文字シーケンスのシーケンスである結果が得られます。内部IEnumerable<char>を文字列に変換するには、を使用しますSelect

summary = permutations(input).Select(chars => new string(chars.ToArray()));
于 2012-08-16T19:19:34.570 に答える
0
summary = permutations(input);

順列が別のクラスにない限り。

于 2012-08-16T19:06:16.190 に答える
0

IEnumerable直接インスタンス化することはできないため、このインターフェイスを実装するクラスを渡す必要があります(一般的な選択肢の1つはList、データを保持するためにを使用することです)。

.NET Frameworkは、文字列を文字配列( )として自動的に解釈し、(つまり)char[]を実装します。これが、次のように文字列をメソッドに直接渡すことができる理由です。IEnumerableIEnumerable<char>

static void Main(string[] args)
{
    string input = "abcdefghijk";
    var summary = permutations(input);
}

上記のコードは、起こっていることのより明示的なバージョンの省略形です。これは、メソッドのシグネチャに明示的に一致するメソッド呼び出しを持つ次のコードで説明できますpermutations

static void Main(string[] args)
{
    string input = "abcdefghijk";

    IEnumerable<char> inputArray = input.ToCharArray();

    IEnumerable<IEnumerable<char>> summary = permutations(inputArray);
}
于 2012-08-16T19:06:45.543 に答える
0

2つの方法で呼び出すことができます。

permutations<char>(input);

また

permutations(input);

2番目の呼び出しはコンパイラ型推論を使用するため、 Tを指定する必要はありません。

その後:

        foreach (var outerEnumerator in permutations(test))
        {
            foreach (var singleChar in outerEnumerator)
            {
                Console.WriteLine(singleChar);
            }
        }

そして、明示的なタイプと優れたフォーマットを備えたバージョン(各単語は別々の行にあります):

        foreach (IEnumerable<char> outerEnumerator in permutations(test))
        {
            foreach (char singleChar in outerEnumerator)
            {
                Console.Write(singleChar);
            }
            Console.WriteLine();
        }

そして今、私たちはどの方法がやろうとしているのかを知っています:

        var test = "test";
        foreach (IEnumerable<char> testPermutation in permutations(test))
        {
            var permutationString = new string(testPermutation.ToArray());
            Console.WriteLine(permutationString);
        }
于 2012-08-16T19:09:07.980 に答える
-1

最も簡単な方法は、のリストを作成することですstring

List<string> strArr = new List<string>();
strArr.Add("firstItem");
strArr.Add("secondItem");
strArr.Add("thirdItem");
IEnumerable<IEnumerable<string>> summary = permutations<string>(strArr);
于 2012-08-16T19:06:53.487 に答える