【发布时间】:2010-09-16 01:40:01
【问题描述】:
有谁知道 C# 中是否有与 Java 的 Set 集合相当的好方法?我知道您可以通过填充但忽略值来模拟使用Dictionary 或HashTable 的集合,但这不是一种非常优雅的方式。
【问题讨论】:
标签: c# .net collections set
有谁知道 C# 中是否有与 Java 的 Set 集合相当的好方法?我知道您可以通过填充但忽略值来模拟使用Dictionary 或HashTable 的集合,但这不是一种非常优雅的方式。
【问题讨论】:
标签: c# .net collections set
试试HashSet:
HashSet(Of T) 类提供高性能的集合操作。集合是不包含重复元素的集合,其元素没有特定的顺序...
HashSet(Of T) 对象的容量是该对象可以容纳的元素的数量。 HashSet(Of T) 对象的容量会随着元素添加到对象中而自动增加。
HashSet(Of T) 类基于数学集合模型,提供类似于访问Dictionary(Of TKey, TValue) 或Hashtable 集合的键的高性能集合操作。简单来说,HashSet(Of T) 类可以被认为是一个没有值的Dictionary(Of TKey, TValue) 集合。
HashSet(Of T) 集合未排序且不能包含重复元素...
【讨论】:
如果您使用的是 .NET 4.0 或更高版本:
如果您需要排序,请使用SortedSet<T>。否则,如果您不这样做,请使用HashSet<T>,因为它是O(1) 用于搜索和操作操作。而SortedSet<T> 是O(log n) 用于搜索和操作操作。
【讨论】:
如果您使用的是 .NET 3.5,则可以使用 HashSet<T>。确实,.NET 不像 Java 那样适合集合。
Wintellect PowerCollections 也可能有帮助。
【讨论】:
我知道这是一个旧线程,但我遇到了同样的问题,发现 HashSet 非常不可靠,因为给定相同的种子,GetHashCode() 返回不同的代码。所以,我想,为什么不直接使用 List 并像这样隐藏 add 方法
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
由于 List 仅使用 Equals 方法来确定相等性,因此您可以在 T 类型上定义 Equals 方法以确保获得所需的结果。
【讨论】:
List.Contains 具有O(n) 复杂性,这意味着您的Add 方法现在也变为O(n) 复杂性。假设不需要调整内部集合的大小,Add 对于List 和HashMap 的复杂性应该是O(1)。 TLDR:这可行,但它很老套,效率较低。
我在Dictionary<T, object> 周围使用了一个包装器,将空值存储在值中。这使得在键上添加、查找和删除 O(1),并且所有意图和目的都像一个集合一样。
【讨论】:
在 CodePlex 上查看PowerCollections。除了 Set 和 OrderedSet 它还有一些其他有用的集合类型,例如 Deque、MultiDictionary、Bag、OrderedBag、OrderedDictionary 和 OrderedMultiDictionary。
更多收藏,还有C5 Generic Collection Library。
【讨论】:
我使用 Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
在很多 OSS 项目中都有用到,我是在 NHibernate 中第一次接触到的
【讨论】: