Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【.NET】IEnumerable<T>をCollectionに変換する拡張メソッドToCollection

ToListがあるなら、ToCollectionがあってもいいと思い、書いてみました。

IEnumerableExtensions.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace Infrastructure {
    public static class IEnumerableExtensions {
        /// <summary>
        /// IEnumerable<T>からCollection<T>作成します。
        /// </summary>
        /// <typeparam name="TCollection">生成するCollection<T>の型。</typeparam>
        /// <typeparam name="TSource"><paramref name="source"/>の要素の型。</typeparam>
        /// <param name="source">List<T>の作成元のIEnumerable<T></param>
        /// <returns>入力シーケンスの要素を含むCollection<T></returns>
        public static TCollection ToCollection<TCollection, TSource>(
            this IEnumerable<TSource> source) where TCollection : Collection<TSource>, new() {

            if (source == null)
                throw new ArgumentNullException(nameof(source));

            TCollection collection = new TCollection();

            foreach (TSource item in source) {
                collection.Add(item);
            }

            return collection;
        }
    }
}

Program.cs

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

namespace Infrastructure {
    class Program {
        static void Main(string[] args) {
            IEnumerable<int> e = Enumerable.Range(1, 10);
            ObservableCollection<int> c = e.ToCollection<ObservableCollection<int>, int>();
            foreach (int i in c) {
                Console.Write(i);   // 12345678910
            }

            Console.ReadKey();
        }
    }
}

intを2回指定しないといけないのが、残念ですね。