我正在寻找在2种不同条件下使用排序列表或数组的最快速,最有效的方法。我想要我的蛋糕,也吃它!
首先,我需要批量添加数百个键/值对(可能多达20,000个)到列表/数组,然后按键排序。 QuickSort可能是最好的方法,在每次添加后确定插入点和洗牌项目当然不是。
之后,我需要偶尔根据需要将键/值对添加到列表/数组中,并将它们插入到正确的位置。每次插入后重新运行QuickSort可能不是最好的方法
当然,我希望它排序的原因是进行快速B树查找以根据键找到值
[仅供参考:在一种情况下,密钥是Guid,值是带有字符串(人性化名称)和一对整数的结构或简单类。在另一种情况下,字符串是关键。不幸的是,字符串/名称不保证是唯一的。一切都保存在RAM中,因为对用户的速度和响应性至关重要。批量添加的所有初始数据都是由另一个应用生成的,我无法控制它。]
我有一些关于如何编写辅助类来实现这一点的想法,但我宁愿不重新发明轮子。然而,我无法想出使用内置列表或集合类来实现它的方法。 SortedList类似乎没有批量添加,常规列表或数组类(一旦排序)没有办法按键插入。
建议?
答案 0 :(得分:2)
您应该考虑使用Dictionary
而不是List
,只要您只根据键而不是值来搜索元素。当尝试获取单个键的值时,这是一个O(1)操作,而不是必须进行许多比较才能在列表中找到相同的对象。
var dictionary = new Dictionary<string, string>
{
{"e11a5c0e-58b4-4f3c-86b8-6a127fff6ee8", "A"},
{"7c1fdecf-7f75-4538-8805-50a67652a5a3", "B"},
{"fed8892c-bb18-4fe3-8e31-8e287afa9243", "C"}
};
if (dictionary.TryGetValue("fed8892c-bb18-4fe3-8e31-8e287afa9243", out var value))
{
Console.WriteLine($"The value is: {value}");
}
此外,如果您可以避免使用GUID并使用顺序int
或long
,那么您可以添加到列表的末尾,对吧?无论你怎么做,当你使用GUID作为你的密钥时,你总是需要进行一些比较来插入和交换其他元素以保持列表的排序。