C# 配列要素のすべての組み合わせを効率的に検索します
配列要素を操作する場合、要素の可能な組み合わせをすべて抽出すると便利です。このタスクは、データ分析や組み合わせ最適化などの分野でよく登場します。
繰り返される要素の順列と組み合わせ
配列 [1, 2, 3, 4] があるとします。繰り返し要素を含む長さ 2 のすべての組み合わせを検索するには、次の関数を使用できます:
<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetPermutationsWithRept<T>(IEnumerable<T> list, int length) { if (length == 1) return list.Select(t => new T[1] { t }); return GetPermutationsWithRept(list, length - 1) .SelectMany(t => list, (t1, t2) => t1.Concat(new T[1] { t2 })); }</code>
この関数は、[1, 1]、[1, 2] などの繰り返し要素を含む組み合わせを考慮します。
順列と組み合わせ (繰り返し要素を除く)
重複した要素を除外するには、GetPermutations
関数を使用します:
<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length) { if (length == 1) return list.Select(t => new T[1] { t }); return GetPermutations(list, length - 1) .SelectMany(t => list.Where(o => !t.Contains(o)), (t1, t2) => t1.Concat(new T[1] { t2 })); }</code>
この関数は、[1, 2]、[1, 3]、[2, 3] などの組み合わせを保証しますが、[1, 1] は保証しません。
繰り返し要素を含む K の組み合わせ
要素の複数の出現を許可する、長さ 2 と繰り返し要素の組み合わせを見つけることを検討してください:
<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetKCombsWithRept<T>(IEnumerable<T> list, int length) where T : IComparable { if (length == 1) return list.Select(t => new T[1] { t }); return GetKCombsWithRept(list, length - 1) .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) >= 0), (t1, t2) => t1.Concat(new T[1] { t2 })); }</code>
この関数は、[1, 1]、[1, 2]、[2, 2] などの組み合わせを生成します。
K 個の組み合わせ (繰り返し要素を除く)
要素が繰り返されない組み合わせの場合:
<code class="language-csharp">static IEnumerable<IEnumerable<T>> GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable { if (length == 1) return list.Select(t => new T[1] { t }); return GetKCombs(list, length - 1) .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0), (t1, t2) => t1.Concat(new T[1] { t2 })); }</code>
この関数は、[1, 2]、[1, 3]、[2, 3] などの組み合わせを生成します。
以上がC# で配列要素のすべての組み合わせを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。