C#Bulk添加到排序列表

时间:2017-09-17 14:37:16

标签: c# list sorting bulk

我正在寻找在2种不同条件下使用排序列表或数组的最快速,最有效的方法。我想要我的蛋糕,也吃它! 首先,我需要批量添加数百个键/值对(可能多达20,000个)到列表/数组,然后按键排序。 QuickSort可能是最好的方法,在每次添加后确定插入点和洗牌项目当然不是。
之后,我需要偶尔根据需要将键/值对添加到列表/数组中,并将它们插入到正确的位置。每次插入后重新运行QuickSort可能不是最好的方法 当然,我希望它排序的原因是进行快速B树查找以根据键找到值 [仅供参考:在一种情况下,密钥是Guid,值是带有字符串(人性化名称)和一对整数的结构或简单类。在另一种情况下,字符串是关键。不幸的是,字符串/名称不保证是唯一的。一切都保存在RAM中,因为对用户的速度和响应性至关重要。批量添加的所有初始数据都是由另一个应用生成的,我无法控制它。] 我有一些关于如何编写辅助类来实现这一点的想法,但我宁愿不重新发明轮子。然而,我无法想出使用内置列表或集合类来实现它的方法。 SortedList类似乎没有批量添加,常规列表或数组类(一旦排序)没有办法按键插入。

建议?

1 个答案:

答案 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并使用顺序intlong,那么您可以添加到列表的末尾,对吧?无论你怎么做,当你使用GUID作为你的密钥时,你总是需要进行一些比较来插入和交换其他元素以保持列表的排序。