C# C语言中最快、最有效的集合类型#

C# C语言中最快、最有效的集合类型#,c#,collections,performance,C#,Collections,Performance,我正在构建一个应用程序,它需要一个集合来容纳大约10k的字符串 集合将用作队列 因此,我们在C#中查看了不同的收集类型,但无法找出哪一种在队列中执行Put和Get操作的速度方面性能最好。还应能够在队列/集合中不允许重复 根据评论进行编辑 任何现有的收藏都会有所帮助。或者一个定制的集合,它可以执行任何现有的集合将是伟大的 谢谢你介意花点时间记忆吗?您可以将队列与字典结合使用。队列将处理队列和出列操作,字典将确保条目的唯一性。一个简单的包装器类可以将这两者结合起来,它将为您提供O(logn)队列和出

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

集合将用作队列

因此,我们在C#中查看了不同的收集类型,但无法找出哪一种在队列中执行Put和Get操作的速度方面性能最好。还应能够在队列/集合中不允许重复

根据评论进行编辑

任何现有的收藏都会有所帮助。或者一个定制的集合,它可以执行任何现有的集合将是伟大的

谢谢

你介意花点时间记忆吗?您可以将队列与字典结合使用。队列将处理队列和出列操作,字典将确保条目的唯一性。一个简单的包装器类可以将这两者结合起来,它将为您提供O(logn)队列和出列时间

例如:

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.");
    }
}
公共类SetQueue
{
私有只读字典副本=新字典();
私有只读队列队列=新队列();
公共布尔排队(T项)
{
如果(!duplicates.ContainsKey(项目))
{
重复项[项目]=真;
排队。排队(项目);
返回true;
}
返回false;
}
公共T出列()
{
如果(queue.Count>0)
{
var item=queue.Dequeue();
如果(!duplicates.ContainsKey(项目))
抛出新的InvalidOperationException(“字典应该包含一个项”);
其他的
重复项。删除(项);
退货项目;
}
抛出新的InvalidOperationException(“无法在空队列上出列”);
}
}
插入此自定义数据结构检查字典是否已包含该项。此操作使用ContainsKey方法,该方法是一个O(logn)操作。如果该项已包含在数据结构中,则该方法将退出。如果未包含该项,则该项将插入到队列中,这是一个常量O(1)操作。它也将被添加到字典中。当字典的计数小于容量时,插入时间也将接近常数O(1)。因此,总队列时间将为O(log n)

出列方法也是如此


此解决方案基本上与内置数据结构OrderedDictionary相同,但是,由于此解决方案使用通用数据结构,因此在装箱/拆箱操作中没有开销,因此速度非常快。

如果您在检查唯一性时要寻找高性能的Put&Get(重复检查)但顺序并不重要(不是队列),然后使用

如果队列功能更重要,则使用


我不认为有什么东西可以同时提供这两种功能。

有一个类可以保持插入顺序,但允许您按键查找值。

使用数组作为fifo如何?考虑过ArrayList,但它们在搜索方面的性能非常差,而Dictionary在执行搜索时非常好,但它们需要更多的资源如果有一个最快的集合,所有其他的都是无用的:)请告诉我们您是否需要一个可以快速插入新项目的集合,或者一个可以快速读取的集合(如果您只构建一次,并且只从中读取,这将产生巨大的差异)。另外,内存使用是否是一个问题?弦有多长?这是个荒谬的问题。这表明排队有问题,但从不说什么。如果有更好的方法实现队列,.NETFramework程序员当然会使用它。你不能做得更好,只能做得更糟。这是一个可能的解决办法。。。。或者我可以让dictorial处理所有收集数据,并使用队列作为缓冲区,从dictorial中设置数据。任何注释。您可以使用哈希集而不是字典,如果字符串是键,则不确定字典中的值是多少。我不确定使用队列作为缓冲区从字典中设置数据是什么意思?@Qua很抱歉不清楚,但请使用字典作为集合,然后从字典中提取一组数据,并将其存储在队列中,以便对每个项目执行get操作。因为队列正在快速地执行此操作,并且在向字典插入值时也是如此。将所有输入收集到队列中,然后将集合插入字典。但我不确定字典是否能够像ArrayList那样进行组插入和提取。迭代字典中存储的所有数据是一个缓慢的操作。有没有什么原因让你不能像我在示例代码中做的那样始终保持这两个同步?我认为你需要更具体地说明你真正想要做什么。条目应该是唯一的,还是应该将相同的条目分组?他正在寻找一种快速解决方案,使队列系统具有唯一的条目。您提供了其中一种情况的解决方案,但不能同时解决这两种情况。我说过,使用任何一种数据结构都不可能同时解决这两种情况。不是吗?+1根据问题的陈述方式,这是一个正确的答案。问题似乎是在寻找现有的集合类型。它不能解决原始问题背后的意图,但我们无法理解他的想法。请注意编辑:“任何优于现有解决方案的自定义数据类型”。我发布的解决方案解决了所有需求,同时提供了出色的性能。