非连续编号的数组.NET
在C#中,哪些集合类型可以用于索引不连续(但只按升序添加)的数组,并且我需要按索引和按位置访问(例如“连续索引”)?例如,如果我添加索引2,4和7的对象A,B和C,我需要通过索引(2/4/7)或地点(1/2/3或0/1/2都有效)。非连续编号的数组.NET
您应该使用Dictionary
存储对象通过其索引访问,但你也需要某种List
到“地方”存储为Dictionary
没有按” t存储地点。将这些一起加入到你自己的课堂中,并将其作为一项操作进行处理,以确保它们同步。
如果您只想使用一个,您可以使用List
并循环查找密钥,但它会花费线性O(N)时间。
编辑
马修Strawbridge指出,BinarySearch
方法会发现在O(日志N)的元素,所以你可以跳过使用字典。
即使只使用一个'List'对,因为它已经排序了,你可以使用['List
谢谢,添加到答案。 – Joe 2013-02-17 21:17:16
使用Dictionary
:
using System.Collections.Generic;
Dictionary<int, type> dict = new Dictionary<int, type>();
// Add values:
dict.Add(2, A);
dict.Add(4, B);
dict.Add(7, C);
// by index:
var A = dict[2];
var B = dict[4];
var C = dict[7];
// by place:
var A = dict.ElementAt(0);
var B = dict.ElementAt(1);
var C = dict.ElementAt(2);
我不确定插入的顺序是保证与***字典
插入顺序当然不能保证。 ElementAt是一种适用于任何IEnumerable的破解。红旗本身。 – usr 2013-02-17 20:30:51
它仍然是最可行的选项,不包括IEnumerable子类。 – 2013-02-17 20:32:01
A,B和C或2,4和7是唯一的吗? – 2013-02-17 20:21:14
将关键字查找字典和订单列表绑定在一起可能是您最好的选择。我认为你可以用k-d树来做这件事,尽管我对它们的了解不多,而且我认为这样做有点矫枉过正。可能如果你想贬低和肮脏,可以通过重新实现Dictionary类的一些部分来提高效率,但我认为这是一个坏主意。 – DarkOtter 2013-02-17 20:44:33
@TimSchmelter在我目前的情况下,他们是独一无二的 – baruch 2013-02-17 20:55:09