将通用列表转换为ISet

22

有人需要将列表分配给ISet吗?我该如何做到这一点?

比方说,我有这个类:

class Foo
{
  ISet<Item> Items { get; set; }
}

现在,我想要做以下事情:

var foo = new Foo() { Items = new List<Item>() { new Item() } }
2个回答

41
List<Item> myList = ...
foo.Items = new HashSet<Item>( myList );

记住,SetList不同,必须只包含每个元素一次。因此,如果myList包含某些元素的多个副本,则除一个之外,所有这些副本都不会进入集合。

元素的相等性(用于检测多个副本)由EqualsGetHashCode方法定义。如果您想要使用不同的相等性定义,可以使用接受IEqualityComparer<Item>HashSet构造函数的重载。


9
List<T> 没有实现 ISet<T> 接口,所以这是不可能的。
唯一实现 ISet<T> 的类是 HashSet<T>SortedSet<T>
如果你去掉中间不必要的 List 对象,最接近的方法是:
var foo = new Foo { Items = new HashSet<Item> { new Item() } };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接