C# 是否实施了IList<;T>;其中Contains(T)是一个O(1)操作?
我想知道是否有一个像C# 是否实施了IList<;T>;其中Contains(T)是一个O(1)操作?,c#,collections,C#,Collections,我想知道是否有一个像HashSet这样的hash支持的IList实现,但提供索引访问 明确地说,我不关心如何实现一个,只是想知道是否有人知道它是否已经可用。提供了这种类型的功能,尽管您必须从中派生并提供一个函数,以便从散列的项中提取密钥。您可以有任意数量的(散列或其他)在.NET 4中有一个新的SortedSet类,其中Contains()是O(1),请参见在.NET 3.5中没有,但很容易实现一个: public class Set<T> : KeyedCollection<
HashSet
这样的hash支持的IList
实现,但提供索引访问
明确地说,我不关心如何实现一个,只是想知道是否有人知道它是否已经可用。提供了这种类型的功能,尽管您必须从中派生并提供一个函数,以便从散列的项中提取密钥。您可以有任意数量的(散列或其他)在.NET 4中有一个新的
SortedSet
类,其中Contains()
是O(1),请参见在.NET 3.5中没有,但很容易实现一个:
public class Set<T> : KeyedCollection<T,T>
{
public Set()
{}
public Set(IEnumerable<T> collection)
{
foreach (T elem in collection)
{
Add(elem);
}
}
protected override T GetKeyForItem(T item)
{
return item;
}
}
公共类集:KeyedCollection
{
公共集()
{}
公共集(IEnumerable集合)
{
foreach(集合中的元素)
{
添加(elem);
}
}
受保护的覆盖T GetKeyForItem(T项)
{
退货项目;
}
}
您可以自己实现IList
并保留两个备份集合-一个列表
和一个哈希集
。基本上,让VisualStudio为IList
中的所有内容提供一个“抛出异常”实现,然后为每个方法确定是要将其代理到列表还是集合
当然,您必须小心重复等(定义
Add(x)
,Add(x)
,Remove(x)
,包含(x)
,您可以在列表中找到它,但不能在集合中找到),但这并不难 实现i收集
,如果有任何用处的话。从3.5版开始提供。快速回答-不,尚未提供
正如您所意识到的,实现它当然很容易。它没有普遍实施的原因如下。如果可以在O(1)中执行包含操作,则可以在O(1)中执行索引查找。但是,如果有重复的元素,索引查找当然不是唯一的
因为您基本上需要两个数据结构,一个集合(或映射)和一个列表,没有比这更有效的方法了,标准库作者让您自己组合数据结构。这不会用作哈希备份的
IList
实现,因为它要求密钥是唯一的,并且不允许重复项。SortedSet
不是IList
Brett,您是对的,我假设是这样,但没有检查。我做了一个编辑,这样人们就可以收回他们的投票。这很酷,我想在4.0中,我将立即使用SortedSet
执行其他任务。很高兴看到一些新的数据结构出现。我现在就是这样做的,我有一个IList实现,它有一个基于哈希的支持表,允许接近O(1)的Contains(T)和IndexOf(T)操作。是的,但它不是一个IList
。当然,我只是不知道是否可以用ICollection而不是IList。大家都知道我的意思,IList
提供索引访问器myList[0]
返回第一个元素,因此任何实现都需要从IList
继承。我有自己的实现,但是像RemoveAt(int)
这样的东西需要仔细注意,以确保支持列表被更新,随后我的实现是O(n),但我没有真正删除,所以这没关系。谢谢Nick,可以说哈希集
也需要两个数据结构,它也需要一个支持表,但它是一个非常有用的结构,当我开始使用3.5时,我就用它取代了我自己的实现。我认为哈希集是一个单一的数据结构,一个表(尽管有些还使用链表)。但是一个试图做所有事情的实现对于大多数人来说都过于臃肿,而一个只快速包含的实现会导致人们抱怨indexOf等等。