どのように私はHashSet.AddRangeを使用してHashSetの()にリストを変換するための一般的な拡張メソッドを書くのですか?
-
22-09-2019 - |
質問
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
」)を使用することを推奨上記の答えが正しいか
所属していません StackOverflow