30

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

var set2 = new HashSet<reference_type>();

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

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

または、このようなユニオンのようなものを使用します。

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

3 に答える 3

46

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

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

個人的には、LINQtoObjectsにとのように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);
}

(カスタム等式比較器の他のオーバーロードを使用します。)

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

于 2012-03-10T17:04:48.747 に答える
18

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

set2 = new HashSet<type>(set);

またはさらに良い:

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

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

于 2012-03-10T17:05:11.907 に答える
6

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

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

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

MSDNドキュメントから:

HashSet<T>(IEnumerable<T> collection)

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

于 2012-03-10T17:04:50.450 に答える