Как мне написать общий метод расширения для преобразования списка в HashSet с помощью HashSet.AddRange()?

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

Вопрос

У 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") является правильным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top