2013-02-17 60 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