web-dev-qa-db-ja.com

ハッシュセットの浅いコピー

それを行うための最良の方法は何ですか?

var set2 = new HashSet<reference_type>();

このようなforeachでセットをトラバースします。

foreach (var n in set)
    set2.Add(n);

または、このようなユニオンのようなものを使用してください。

set2 = set.UnionWith(set); // all the elements
26
alan2here

コンストラクターを使用します。

HashSet<type> set2 = new HashSet<type>(set1);

個人的には、LINQ toObjectsにToHashSetListの場合と同じようにDictionary拡張メソッドがあればいいのにと思います。もちろん、独自のものを作成するのは簡単です。

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return new HashSet<T>(source);
}

(カスタム等式比較器用の他のオーバーロードあり。)

これにより、匿名タイプのセットを簡単に作成できます。

32
Jon Skeet

ベストは主観的ですが、私は次のようにします:

set2 = new HashSet<type>(set);

またはさらに良い:

set2 = new HashSet<type>(set, set.Comparer);

これにより、元のHashSetと同じ等式比較子を使用していることが保証されます。たとえば、オリジナルが大文字と小文字を区別しない場合HashSet<string>、新しいものでも大文字と小文字は区別されません。

14
Joe

これはおそらく最も簡単で最良です:

HashSet<int> s = new HashSet<int>{1,2,3};

HashSet<int> t = new HashSet<int>(s);

MSDN docs から:

HashSet<T>(IEnumerable<T> collection)

セットタイプのデフォルトの等式比較子を使用し、指定されたコレクションからコピーされた要素を含み、コピーされた要素の数に対応するのに十分な容量を持つHas​​hSetクラスの新しいインスタンスを初期化します。

5
Phil