List.BinarySearch vs Dictionary.TryGetValue - 更快

2 c#

说500个元素会更快.

或者检索元素的数据结构/集合是什么?

        List<MyObj> myObjs = new List<MyObj>();
        int i = myObjs.BinarySearch(myObjsToFind);
        MyObj obj = myObjs[i];
Run Code Online (Sandbox Code Playgroud)

要么

        Dictionary<MyObj, MyObj> myObjss = new Dictionary<MyObj, MyObj>();
        MyObj value;
        myObjss.TryGetValue(myObjsToFind, out value);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

我假设在您的真实代码中,您实际上填充了 myObjs - 并对其进行排序.

你刚试过吗?这取决于几个因素:

  • 您是否因任何其他原因需要对列表进行排序?
  • MyObj.CompareTo(MyObj)的速度有多快?
  • MyObj.GetHashCode()的速度有多快?
  • MyObj.Equals()的速度有多快?
  • 你有多大可能得到哈希冲突?
  • 它真的对你有重大影响吗?

在二进制搜索案例中,对单个调用GetHashCode和在字典情况下对Equals进行一些调用(取决于散列冲突),需要进行大约8或9次比较.然后是两种情况下涉及的内在计算(访问数组等).

这真的是你的瓶颈吗?

我预计词典是快一点,在500点的元素,但不是快得多.随着收集的增长,差异将明显增加.