値の重複チェックに便利なHashSet

プログラミングC# 第6版 9.2


HashSetは値の重複がないコレクションです。例えばあるデータに対して処理を行うときに、重複してる値には処理をしたくないという処理を書く場合以下のようになります。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        string[] strs = new string[] {
            "foo",
            "bar",
            "baz",
            "hoge",
            "foo",
            "hoge",
            "muge"
        };
        
        var hashset = new HashSet<string>();
        
        foreach(var str in strs) {
            // 既に追加済みのキーが来た場合はfalseになる
            if ( hashset.Add(str) ) {
                Console.WriteLine(str);
            }
        }
    }
}
$ main
foo
bar
baz
hoge
muge

うまくいってますね。ちなみにDictionaryでも同じような処理を書くことが出来ます

class Program {
    static void Main() {
        string[] strs = new string[] {
            "foo",
            "bar",
            "baz",
            "hoge",
            "foo",
            "hoge",
            "muge"
        };
        
        var hashset = new Dictionary<string,bool>();
        
        foreach(var str in strs) {
            // キーが存在しない場合のみ処理
            if ( !hashset.ContainsKey(str) ) {
                hashset[str] = true;
                Console.WriteLine(str);
            }
        }
    }
}

ただしDictionaryはValueの分だけ無駄にデータを確保しなければならないので重複チェック用であればHashSetを使った方が効率が良さそうですね。