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等等。