それを行うための最良の方法は何ですか?
var set2 = new HashSet<reference_type>();
このようなforeachでセットをトラバースします。
foreach (var n in set)
set2.Add(n);
または、このようなユニオンのようなものを使用してください。
set2 = set.UnionWith(set); // all the elements
コンストラクターを使用します。
HashSet<type> set2 = new HashSet<type>(set1);
個人的には、LINQ toObjectsにToHashSet
とList
の場合と同じようにDictionary
拡張メソッドがあればいいのにと思います。もちろん、独自のものを作成するのは簡単です。
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new HashSet<T>(source);
}
(カスタム等式比較器用の他のオーバーロードあり。)
これにより、匿名タイプのセットを簡単に作成できます。
ベストは主観的ですが、私は次のようにします:
set2 = new HashSet<type>(set);
またはさらに良い:
set2 = new HashSet<type>(set, set.Comparer);
これにより、元のHashSetと同じ等式比較子を使用していることが保証されます。たとえば、オリジナルが大文字と小文字を区別しない場合HashSet<string>
、新しいものでも大文字と小文字は区別されません。
これはおそらく最も簡単で最良です:
HashSet<int> s = new HashSet<int>{1,2,3};
HashSet<int> t = new HashSet<int>(s);
MSDN docs から:
HashSet<T>(IEnumerable<T> collection)
セットタイプのデフォルトの等式比較子を使用し、指定されたコレクションからコピーされた要素を含み、コピーされた要素の数に対応するのに十分な容量を持つHashSetクラスの新しいインスタンスを初期化します。