Wie schreibe ich eine generische Erweiterungsmethode Liste in HashSet mit HashSet.AddRange () zu konvertieren?

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

Frage

HashSet keine AddRange Methode, so dass ich für sie eine Erweiterungsmethode schreiben möchten. Das ist, was ich habe:

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

Ich habe eine Basisklasse, Medien, und eine abgeleitete Klasse, Foto. Dies ist der Code, dass ich arbeiten will:

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

Allerdings ist der Compiler sagt mir, dass es nicht die List<Photo> zu IEnumerable<Media> umwandeln kann, wenn ich versuche AddRange() zu verwenden. Ich bin mir ziemlich sicher, dass dies, weil ich IEnumerable<T> in der Verlängerung Methode, aber wie schreibe ich es so, dass der Typ als der Typ in AddRange<T> anders ist?

War es hilfreich?

Lösung

Noch ein weiteres generic-Varianz Problem. Sie müssen die Cast<Media> Erweiterung Methode aufzurufen, die IEnumerable<Photo> zu IEnumerable<Media> zu konvertieren, bevor es zu einem AddRange Implementierung Unterschrift akzeptabel sein wird.

Alternativ können Sie erklären

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

als Behelfslösung der richtige Varianz in der Signatur zu erzeugen.

Andere Tipps

Eigentlich HashSet<T> darf keine AddRange Methode haben, aber es hat eine UnionWith Methode, die semantisch ist, was Sie suchen. Der Unterschied in dem Namen spiegelt die Tatsache wider, dass es Duplikate herausfiltert. Es hat auch einen Konstruktor, der ein IEnumerable<T> als Parameter übernimmt, wenn Sie nur eine Sammlung in eine HashSet kopieren möchten.

Im allgemeinen Fall ist die oben genannte Antwort empfiehlt eine generische Einschränkung zu verwenden ( „where T : U“) korrekt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top