引っ越したjyokun

プログラムブログになるのかもしれない

久しぶり。コンビネーションのクラスが必要だったので作ってみた。

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

namespace Combinations {
    public class Combinations<T> : IEnumerable<IEnumerable<T>> {
        private T[] _source;
        private int _subsetLength;

        public Combinations(IList<T> source, int subsetLength) {
            _source = source.ToArray();
            _subsetLength = subsetLength;
        }

        public IEnumerator<IEnumerable<T>> GetEnumerator() {
            int[] indices = Enumerable.Range(0, _subsetLength).ToArray();
            int lastTopIndex = _source.Length - _subsetLength;

            for (; ; ) {
                yield return indices.Select(i => _source[i]);

                for (int i = _subsetLength - 1; ; i--) {
                    if (i < 0) yield break;

                    if (indices[i] < lastTopIndex + i) {
                        indices[i]++;
                        for (int j = i + 1; j < _subsetLength; j++) {
                            indices[j] = indices[j - 1] + 1;
                        }
                        break;
                    }
                }
            }
        }

        IEnumerator IEnumerable.GetEnumerator() {
            return GetEnumerator();
        }
    }

    public static class Program {
        static void Main(string[] args) {
            string[] values = { "竜", "虎", "兎", "燕", "鯉", "星" };
            Combinations<string> c = new Combinations<string>(values, 2);
            foreach (IEnumerable<string> it in c) {
                Console.WriteLine(String.Join(",", it));
            }
            Console.ReadKey();
        }
    }
}