c# - 如何编写通用扩展方法以使用 HashSet.AddRange() 将 List 转换为 HashSet?

标签 c# generics extension-methods hashset

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> 中的类型?

最佳答案

实际上,HashSet<T>可能没有 AddRange方法,但它有一个 UnionWith方法,这在语义上就是您正在寻找的。名称上的差异反射(reflect)了它过滤掉重复项的事实。它还有一个构造函数,它接受 IEnumerable<T>。作为参数,如果您只想将集合复制到 HashSet .

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

关于c# - 如何编写通用扩展方法以使用 HashSet.AddRange() 将 List 转换为 HashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1590662/

相关文章:

c# - 在 Windows 窗体中选择和更新数据表

c# - 如何在 C# 中返回委托(delegate)函数或 lambda 表达式?

java - Jersey 2.5 : Replacement for JResponse?

c# - 可以将 C# 扩展方法添加到 F# 类型吗?

c# - 通过 Authorize.Net C# SDK 使用银行账户

c# - LINQ 查询中的三元运算符

c# - 如何在没有程序集版本号的情况下指定 wcf BehaviourExtension 类类型?

Java 泛型 : unbounded wildcard generalization not working past second level

apache-flex - 是否可以在不继承类的情况下向非动态 ActionScript 3 类添加行为?

F# 一个扩展方法引用另一个