Como escrevo um método de extensão genérica para converter uma lista em um hashset usando hashset.addrange ()?

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

Pergunta

O hashset não possui um método de addRange, então quero escrever um método de extensão para ele. Isso é o que eu tenho:

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

Eu tenho uma classe base, mídia e uma classe derivada, foto. Este é o código que eu quero trabalhar:

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

No entanto, o compilador está me dizendo que não pode converter o List<Photo> para IEnumerable<Media> Quando tento usar AddRange(). Tenho certeza de que isso é porque eu tenho IEnumerable<T> no método de extensão, mas como faço para escrevê -lo para que o tipo seja diferente do tipo AddRange<T>?

Foi útil?

Solução

Mais uma questão de variação genérica. Você precisará ligar para o Cast<Media> método de extensão para converter o IEnumerable<Photo> para IEnumerable<Media> Antes que seja aceitável para o seu AddRange Assinatura da implementação.

Como alternativa, você pode declarar

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

como uma solução alternativa para produzir a variação correta na assinatura.

Outras dicas

Na realidade, HashSet<T> pode não ter um AddRange método, mas tem um UnionWith Método, que é semanticamente o que você está procurando. A diferença no nome reflete o fato de filtrar duplicatas. Ele também tem um construtor que leva um IEnumerable<T> Como parâmetro, se você deseja apenas copiar uma coleção em um HashSet.

No caso geral, a resposta acima recomendando usar uma restrição genérica ("where T : U") está correto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top