どのように私はHashSet.AddRangeを使用してHashSetの()にリストを変換するための一般的な拡張メソッドを書くのですか?

StackOverflow https://stackoverflow.com/questions/1590662

質問

HashSetのは、私はそれのための拡張メソッドを書きたいので、AddRangeメソッドを持っていません。これは私が持っているものです。

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> list)
{
    foreach (var item in list)
    {
        collection.Add(item);
    }
}

私は、基本クラス、メディア、および派生クラス、写真を持っています。これは私が仕事をしたいというコードです。

var photos = new List<Photo>();
var media = new HashSet<Media>();
media.AddRange(photos);

しかし、コンパイラは私がList<Photo>を使用しようとすると、それはIEnumerable<Media>AddRange()を変換することができないことを私に語っています。私は、拡張メソッドでIEnumerable<T>を持っているので、かなり確信して、これはあるんだけど、どのように私はタイプがAddRange<T>でタイプとは異なっているように、それを書くのですか?

役に立ちましたか?

解決

さらに別の一般的な-分散の問題。それはあなたのCast<Media>実装の署名に許容されるものには、事前にIEnumerable<Photo>IEnumerable<Media>を変換するAddRange拡張メソッドを呼び出す必要があります。

また、あなたが宣言することができます。

AddRange<T, U>(ICollection<T>, IEnumerable<U>) where U : T
署名に正しい分散を生成するための回避策として、

他のヒント

実際には、HashSet<T>AddRangeメソッドを持っていない可能性があり、それはあなたが探しているものを意味的にあるUnionWith方法を、持っています。名前の違いは、それは重複を除外しているという事実を反映しています。あなただけIEnumerable<T>にコレクションをコピーしたい場合にも、パラメータとしてHashSetを取るコンストラクタを持っています。

は一般的な場合には、一般的な制約(「where T : U」)を使用することを推奨上記の答えが正しいか

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top