1

HashSet には AddRange メソッドがないので、その拡張メソッドを書きたいと思います。これは私が持っているものです:

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

基本クラス Media と派生クラス Photo があります。これは私が働きたいコードです:

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

ただし、コンパイラは、を使用しようとすると、List<Photo>をに変換できないと言っています。これは拡張メソッドにあるためだと確信していますが、型が の型と異なるようにするにはどうすればよいですか?IEnumerable<Media>AddRange()IEnumerable<T>AddRange<T>

4

2 に答える 2

10

実際にはメソッドHashSet<T>がないかもしれませんが、意味的に探しているメソッドがあります。名前の違いは、重複を除外するという事実を反映しています。コレクションを にコピーするだけの場合は、パラメータとしてを受け取るコンストラクタもあります。AddRangeUnionWithIEnumerable<T>HashSet

一般的なケースでは、一般的な制約 (" where T : U") を使用することを推奨する上記の回答は正しいです。

于 2009-10-19T19:42:46.940 に答える
3

さらに別の一般的な差異の問題。実装の署名に受け入れられるようにするには、拡張メソッドを呼び出して を に変換する必要がありますCast<Media>IEnumerable<Photo>IEnumerable<Media>AddRange

または、宣言することもできます

AddRange<T, U>(ICollection<T>, IEnumerable<U>) where U : T

署名の正しい差異を生成するための回避策として。

于 2009-10-19T19:40:38.037 に答える