コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】配列やリストから重複組合せを取得できる拡張メソッド

はじめに

上記サイト様が、リストから組み合わせを取得できる関数を公開されております
こちらを少し修正して、配列やリストから重複組合せを取得できる拡張メソッドを作りました

ソースコード

using System.Collections.Generic;
using System.Linq;

public static class IListExt
{
    public static IEnumerable<List<T>> CombinationWithRepetition<T>( this IList<T> self, int n )
    {
        return Enumerable.Range( 0, n - 1 )
            .Aggregate(
                Enumerable.Range( 0, self.Count )
                    .Select( num => new List<int> { num } ),
                ( list, _ ) => list.SelectMany(
                    c =>
                        Enumerable.Range( c.Max(), self.Count - c.Max() )
                            .Select( num => new List<int>( c ) { num } )
                )
            )
            .Select(
                c => c
                    .Select( num => self[ num ] )
                    .ToList()
            );
    }
}

使用例

using System;
using System.Linq;
using System.Text;

public static class Program
{
    private static void Main()
    {
        var array = new[] { 1, 2, 3, 4, 5 };
        var results = array
            .CombinationWithRepetition( 3 )
            .ToArray()
        ;

        Console.WriteLine( "組合せの数:" + results.Length );
        Console.WriteLine();

        foreach ( var result in results )
        {
            var sb = new StringBuilder();

            foreach ( var n in result )
            {
                sb.Append( $"{n}, " );
            }

            Console.WriteLine( sb );
        }
    }
}
組合せの数:35

1, 1, 1,
1, 1, 2,
1, 1, 3,
1, 1, 4,
1, 1, 5,
1, 2, 2,
1, 2, 3,
1, 2, 4,
1, 2, 5,
1, 3, 3,
1, 3, 4,
1, 3, 5,
1, 4, 4,
1, 4, 5,
1, 5, 5,
2, 2, 2,
2, 2, 3,
2, 2, 4,
2, 2, 5,
2, 3, 3,
2, 3, 4,
2, 3, 5,
2, 4, 4,
2, 4, 5,
2, 5, 5,
3, 3, 3,
3, 3, 4,
3, 3, 5,
3, 4, 4,
3, 4, 5,
3, 5, 5,
4, 4, 4,
4, 4, 5,
4, 5, 5,
5, 5, 5,

組合せの数が正しいかどうかは下記のサイト様で確認できます

関連記事