2

次のように機能する関数を見つける必要があります。

 int[] matches = getAllPossibleCombinations(
    int lengthOfEachIntReturnedInArray, 
    List<char> typesOfElementsUsedInCombinations);

入力要素は次のとおりです (これは単なる例です)。

  • int lengthofeachintreturnedinarray = (int) 2
  • List<char> typesofelementsusedincombinations = {a,b}

その場合、出力は (文字列配列で) ある必要があります。

ああ

ab

bb

配列内の個々の出力要素には、メソッドの最初の引数 (この場合は 2) によって定義された長さが必要であり、2 番目の引数で指定された文字間のすべての可能な組み合わせが含まれている必要があります。

パワーセットについて何か見たことがありますが、それらを使用する必要がありますか、それともforeachループを使用する必要がありますか?

! 上記の回答で提案された質問は同じではなく、設定された長さを使用しません!

4

1 に答える 1

2

Linq でデカルト積を実装することに関するEric Lippert の記事を紹介します。これは、彼が拡張メソッドとして書いているものです。

static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) 
{ 
  IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
  return sequences.Aggregate( 
    emptyProduct, 
    (accumulator, sequence) => 
      from accseq in accumulator 
      from item in sequence 
      select accseq.Concat(new[] {item})); 
}

これを使用すると、次のようにメソッドを実装できます。

static IEnumerable<string> GetAllPossibleCombinations(
    int lengthofeachintreturnedinarray, 
    IEnumerable<string> typesofelementsusedincombinations) 
{
    return Enumerable
        .Repeat(typesofelementsusedincombinations, lengthofeachintreturnedinarray)
        .CartesianProduct()
        .Select(strings => String.Concat(strings));
}
于 2013-09-05T16:32:39.860 に答える