1

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>扩展方法,但是我该如何编写它以使类型与 in 中的类型不同AddRange<T>

4

2 回答 2

10

实际上,HashSet<T>可能没有AddRange方法,但它有一个UnionWith方法,这在语义上就是您要寻找的。名称的不同反映了它过滤掉重复项的事实。IEnumerable<T>如果您只想将集合复制到 a中,它还有一个以 a 作为参数的构造函数HashSet

在一般情况下,建议使用通用约束(“ where T : U”)的上述答案是正确的。

于 2009-10-19T19:42:46.940 回答
3

另一个泛型差异问题。您需要调用Cast<Media>扩展方法将其转换为IEnumerable<Photo>IEnumerable<Media>然后才能被您的AddRange实现签名接受。

或者,您可以声明

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

作为在签名中产生正确方差的解决方法。

于 2009-10-19T19:40:38.037 回答