0

値の文字列を渡すために呼び出す必要がある制裁 API があります。これらの値は次のように構成されます。

string searchString = string.Join(" ", myList.ToArray());
// remove any numbers and return complete words
MatcCollection strMatch = Regex.Matches(searchString, @"[^\W\d]+");

var values = strMatch.Cast<Group>().Select(g => g.Value).ToArray();

var combinations = values.Permutations();

これで、必要な配列が得られたので、以下の Permutations メソッドを呼び出します。

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
    {
        if (source == null)
            throw new ArgumentException("source");
        return permutations(source.ToArray());
    }

順列メソッドは次のとおりです。

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

7 項目 {one,two,three,four,five,six,seven} のリストの例では、このコードは 7 つの要素の長さの多数のリストを返します。

私が作成する必要があるのは次のとおりです。

最初の反復:

結果を返す = 1

2 回目の繰り返しの戻り値 = one + ' ' + two

などなど

SOの投稿から上記のサンプルコードを取得したので、必要なものを取得するために適切に変更する方法がわかりません。

4

1 に答える 1

2

では、7 つの項目のすべての順列だけでなく、列挙されたそれらのサブセット (すべての組み合わせのようなもの) も必要であるというのは正しいでしょうか?

permutationsその動作を取得する最も簡単な方法は、メソッドにある種の長さパラメーターを追加することだと思います。

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

次に、1 から n までのパラメーターを指定してこのメ​​ソッドを呼び出します。

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
{
    if (source == null)
        throw new ArgumentException("source");
    var src = source.ToArray();
    for (int i = 1; i <= src.Length; i++)
        foreach (var result in permutations(src, i))
            yield return result;
}

タイプミスがないことを願っています...

于 2013-09-12T11:05:18.837 に答える