2013-02-17 50 views
1

在C#中,哪些集合类型可以用于索引不连续(但只按升序添加)的数组,并且我需要按索引和按位置访问(例如“连续索引”)?例如,如果我添加索引2,4和7的对象A,B和C,我需要通过索引(2/4/7)或地点(1/2/3或0/1/2都有效)。非连续编号的数组.NET

+2

A,B和C或2,4和7是唯一的吗? – 2013-02-17 20:21:14

+0

将关键字查找字典和订单列表绑定在一起可能是您最好的选择。我认为你可以用k-d树来做这件事,尽管我对它们的了解不多,而且我认为这样做有点矫枉过正。可能如果你想贬低和肮脏,可以通过重新实现Dictionary类的一些部分来提高效率,但我认为这是一个坏主意。 – DarkOtter 2013-02-17 20:44:33

+0

@TimSchmelter在我目前的情况下,他们是独一无二的 – baruch 2013-02-17 20:55:09

回答

2

您应该使用Dictionary存储对象通过其索引访问,但你也需要某种List到“地方”存储为Dictionary没有按” t存储地点。将这些一起加入到你自己的课堂中,并将其作为一项操作进行处理,以确保它们同步。

如果您只想使用一个,您可以使用List并循环查找密钥,但它会花费线性O(N)时间。

编辑

马修Strawbridge指出,BinarySearch方法会发现在O(日志N)的元素,所以你可以跳过使用字典。

+1

即使只使用一个'List'对,因为它已经排序了,你可以使用['List .BinarySearch'](http://msdn.microsoft.com/en-US/library/w4e7fxsh(v = vs.110 ).aspx)查找O(log N)时间中的元素。 – 2013-02-17 21:13:15

+0

谢谢,添加到答案。 – Joe 2013-02-17 21:17:16

1

使用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); 
+3

我不确定插入的顺序是保证与***字典 ***的存储顺序。 “按指数”将保证工作,但我不确定“按地点”。如果您想保证索引访问,请改用*** OrderedDictionary ***。 – 2013-02-17 20:30:28

+0

插入顺序当然不能保证。 ElementAt是一种适用于任何IEnumerable的破解。红旗本身。 – usr 2013-02-17 20:30:51

+0

它仍然是最可行的选项,不包括IEnumerable子类。 – 2013-02-17 20:32:01