Como escrevo um método de extensão genérica para converter uma lista em um hashset usando hashset.addrange ()?
-
22-09-2019 - |
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>
?
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.