Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哈希表与字典:更快?_C# - Fatal编程技术网

C# 哈希表与字典:更快?

C# 哈希表与字典:更快?,c#,C#,也许这个问题以前已经以许多不同的方式得到过多次回答。然而,我在寻找更具体的东西。我认为,通用词典比哈希表更快,因为它们不需要经历装箱/取消装箱的过程 但是,哈希表是否已排序,这意味着搜索可能会更快?由于密钥是散列和存储的,搜索时是否会涉及装箱/取消装箱?哈希表被视为不推荐使用,但后向兼容性和一些边缘情况除外,如COM Interop 字典还提供了类型安全性,避免了装箱过程(这通常会使它们更快) 但是,如果您确实想知道它对性能有什么影响,请使用Stopwatch记录两种类型在两个相同的数据集中执行

也许这个问题以前已经以许多不同的方式得到过多次回答。然而,我在寻找更具体的东西。我认为,通用词典比哈希表更快,因为它们不需要经历装箱/取消装箱的过程


但是,哈希表是否已排序,这意味着搜索可能会更快?由于密钥是散列和存储的,搜索时是否会涉及装箱/取消装箱?

哈希表
被视为不推荐使用,但后向兼容性和一些边缘情况除外,如
COM Interop

字典还提供了类型安全性,避免了装箱过程(这通常会使它们更快)

但是,如果您确实想知道它对性能有什么影响,请使用
Stopwatch
记录两种类型在两个相同的数据集中执行相同操作的时间,并注意时间差

代码将类似于:

        Stopwatch clock = new Stopwatch();
        clock.Start();
        foreach (var item in myCol)
        {
            Hashtable ht = new Hashtable();
            //DoSomething()
        }
        clock.Stop();
        var tHash = clock.Elapsed;
        Stopwatch clock = new Stopwatch();
        clock.Start();
        foreach (var item in myCol)
        {
            Dictionary<,> dict = new Dictionary<,>();
            //DoSomething()
        }
        clock.Stop();
        Console.Write($"Delta t = {Math.Abs((tHash - clock.Elapsed).TotalMilliseconds)}"ms);
秒表时钟=新秒表();
clock.Start();
foreach(mycl中的变量项)
{
Hashtable ht=新的Hashtable();
//DoSomething()
}
时钟停止();
var tHash=时钟已过;
秒表时钟=新秒表();
clock.Start();
foreach(mycl中的变量项)
{
Dictionary dict=新字典();
//DoSomething()
}
时钟停止();
Write($“Delta t={Math.Abs((tHash-clock.appeased.total毫秒)}”ms);
然而,哈希表是否已排序,这可能意味着搜索速度可能会更快

我不相信哈希表是经过排序的

它们共享一个类似的底层实现,但长期以来,人们推荐使用
Dictionary
而不是
Hashtable
,这将更好地执行值类型,因为它消除了装箱/取消装箱


如果你真的想知道,试试基准测试。这是一个很好的库。

只有在
哈希表中使用值类型(struct)时,才会进行装箱/取消装箱。否则,当您在检索条目时想要获取特定类型时,它只是强制转换。您还应该使用
HashSet
,这是一种通用查找,而不是
Hashtable
。是什么让您认为哈希表正在对任何内容进行排序?哈希表的可能重复项将被视为过时?如果这是真的,为什么他们要将它添加到.Net Core中?除了在一些边缘情况下它是有用的,它可能应该被认为是这样的:过时和只适合在某些情况下使用之间有很大的区别。你的意见是好的,但称它为过时是不正确的。@DavidG你的论点没有遵循。MS不会将其标记为过时,以免破坏使用它的遗留代码。这并没有改变这样一个事实,即只有遗留代码应该使用它,而且如果您可以访问
字典
,就没有理由使用它。该类已过时。