Как мне написать общий метод расширения для преобразования списка в HashSet с помощью HashSet.AddRange()?
-
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);
}
}
У меня есть базовый класс Media и производный класс Photo.Это код, с которым я хочу работать:
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
") является правильным.