Architect's Log

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

【.NET】HashSet<T>に拡張メソッドでAddRangeを実装する

List<T>にはAddRangeがありますが、なぜかHashSet<T>にはありません。

拡張メソッドで実装してみました。

HashSetExtensions.cs

using System;
using System.Collections.Generic;

namespace Extensions {
    public static class HashSetExtensions {
        /// <summary>
        /// 指定したコレクションの要素を<see cref="System.Collections.Generic.HashSet&lt;T&gt;"/>の末尾に追加します。
        /// </summary>
        /// <typeparam name="T">ハッシュセット内の要素の型。</typeparam>
        /// <param name="self"><see cref="System.Collections.Generic.HashSet&lt;T&gt;"/>のインスタンス。</param>
        /// <param name="collection">
        /// <see cref="System.Collections.Generic.HashSet&lt;T&gt;"/>の末尾に要素が追加されるコレクション。
        /// コレクション自体をnullにすることはできませんが、型<typeparamref name="T"/>が参照型の場合、
        /// コレクションに格納する要素はnullであってもかまいません。
        /// </param>
        public static void AddRange<T>(this HashSet<T> self, IEnumerable<T> collection) {
            if (self == null)
                throw new NullReferenceException(string.Format("nullに対して{0}を呼び出すことはできません。", nameof(AddRange)));

            if (collection == null)
                throw new ArgumentNullException(nameof(collection), "パラメーターがnullです。");

            foreach (T item in collection) {
                self.Add(item);
            }
        }
    }
}

Program.cs

using System;
using System.Collections.Generic;

namespace Extensions {
    class Program {
        static void Main(string[] args) {
            HashSet<int> hashSet = new HashSet<int>() { 1, 2, 3 };
            hashSet.AddRange(new List<int>() { 2, 3, 4 });

            foreach (int i in hashSet) {
                Console.WriteLine(i);
            }

            Console.ReadKey();
        }
    }
}

実行結果

ちゃんと、重複が排除されています。
f:id:JHashimoto:20160117183825p:plain