C#中速度最快,效率最高的集合类型

时间:2011-03-26 06:42:21

标签: c# collections performance

我正在构建一个应用程序,它需要一个集合来容纳大约10k的字符串。

集合将用作队列。

所以正在查看C#中的不同集合类型,但无法确定哪一个在Queue中执行Put和Get操作的速度方面具有最佳性能。也应该能够不允许在队列/集合中重复。

根据评论编辑..

任何现有的收藏都会有所帮助。或者可以执行任何现有收藏的自定义集合将会很棒。

由于

3 个答案:

答案 0 :(得分:8)

如果您正在寻找高性能Put&amp;在检查唯一性(重复检查)时获取,但订单无关紧要(不是队列),然后使用HashSet<T>

如果队列功能更重要,请使用Queue<T>

我认为没有任何东西可以同时提供。

答案 1 :(得分:6)

你介意花O(2n)记忆吗?您可以使用队列&lt;&gt;与词典&lt;,&gt;结合使用。队列将处理队列和出列操作,字典将确保唯一条目。一个简单的包装类可以将这两个组合起来,它会给你O(log n)队列和出队时间。

示例:

public class SetQueue<T>
{
    private readonly Dictionary<T, bool> duplicates = new Dictionary<T, bool>();
    private readonly Queue<T> queue = new Queue<T>();

    public bool Enqueue(T item)
    {
        if (!duplicates.ContainsKey(item))
        {
            duplicates[item] = true;

            queue.Enqueue(item);

            return true;
        }

        return false;
    }

    public T Dequeue()
    {
        if (queue.Count >0)
        {
            var item = queue.Dequeue();
            if (!duplicates.ContainsKey(item))
                throw new InvalidOperationException("The dictionary should have contained an item");
            else
                duplicates.Remove(item);

            return item;
        }

        throw new InvalidOperationException("Can't dequeue on an empty queue.");
    }
}

插入此自定义数据结构中检查字典是否已包含该项目。此操作使用ContainsKey方法,该方法是O(log n)操作。如果该项已包含在数据结构中,则该方法已退出。如果未包含该项,则该项将被插入到队列中,该队列是常量O(1)操作。它也将被添加到字典中。当字典的计数小于容量时,这将接近常数,O(1)插入时间。因此总队列时间为O(log n)。

出局方法也是如此。

此解决方案与内置数据结构OrderedDictionary基本相同,但是,由于此解决方案使用泛型,因此在装箱操作中没有任何开销,从而使其浪费更快。

答案 2 :(得分:6)

OrderedDictionary类可以保留插入顺序,但允许您按键查找值。