2012-12-12 166 views
0

我有10萬串每一個固定排序的索引值是這樣的:字典,數組或列表的索引快速搜索和值

Index String Value 
    0  XXXXXXXXXXXXXXXXXXXXX 
    1  XXXXXXXXXX 
    2  (empty string) 
    3  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
    4  XXXXX 
    5  XXXXXXXXX 
    6  XXXXXXXXXXXXXXX 
    7  (empty string) 
    8  XX 
    9  XXXXXXXXXX 
10  XXXXXXXXXXXXXXXXXXXXXXXXXX 
... ... 
99999 XXXXXXXXXXXXXXXXXXX 

我的數據結構必須持有完全相同100000有序條目和一些(或許多)的字符串值可能是空的,至少在最初時是如此。每個索引值都是唯一的(順序整數),除空字符串外,每個字符串值也是唯一的。爲了在我的UI中進行顯示,我通常只填充我的數據結構,將列表框綁定到它(使用指定的DisplayMember和ValueMember)。但在這種情況下,我只想顯示而不是空的字符串。所以想必,我需要通過我的數據結構進行迭代,並添加適用的項目列表框在一個類似的方式:

foreach (item in MyDataStructure) 
{ 
    if (item.StringValue != string.Empty) 
    { 
     listBox1.Items.Add(item); 
    } 
} 

對我來說,能夠保持每個字符串之間的關係是非常重要的及其指數值。正如您所料,我的用戶需要添加/編輯/刪除字符串。理論上,所有三個操作都歸結爲同一個事物:更新特定索引處的字符串值。要添加一個新的字符串,我需要首先遍歷我的數據結構,並確保在某個地方有一個空字符串,以便我可以用新字符串替換它。如果不存在空字符串,我的用戶將需要「編輯」現有的字符串或首先「刪除」另一個字符串,因爲我們正在處理固定數量的總字符串(100k)。從編程的角度來看,「刪除」一個字符串也僅僅是在我的數據結構中的適當索引處用空/空字符串替換它的問題。

是最好的,我可以預見,我需要的數據結構,可以很容易做到以下幾點:

  1. 爲每個非空字符串添加索引和字符串值的列表框和使用作爲ValueMember的索引和作爲DisplayMember的字符串。
  2. 快速搜索的數據結構的特定索引和檢索它的字符串值
  3. 快速搜索的數據結構的字符串,看它是否已經存在

考慮到這些事情,任何人都可以推薦特定的數據結構可以幫助完成任務?我最初想到一個帶有鍵/值對的字典來保存每個索引/字符串。然後有人建議使用一個數組,因爲總大小是固定的,數組索引本身也可以作爲每個字符串值的索引值。

+2

索引和字符串值之間的關係是什麼?另外,爲什麼總共需要有10萬個字符串? –

+0

叫我瘋了,但你爲什麼不使用數據庫?(散列表是你唯一可行的選擇) – Nahum

+0

正如我的答案旁註 - 爲什麼你總是需要有100'000?你不能從0開始,然後添加,只需設置最大值100'000,然後添加/刪除/編輯列表。 – LukeHennerley

回答

2

看到你有一個項目一個固定的量在List,你需要爲每個項目的索引,你只需看看不是一個數組。

string[] arr = new string[100000]; 

您還可以訪問LINQ陣列,因此您可以滿足您的條件。

//1 
arr.Where(x => !string.IsNullOrEmpty(x)).Select(str => new { value = Array.IndexOf(arr, str), display = str }); 
//2 
string str = arr[index]; 
//3 
arr.Any(x => x == "SomeString"); 
0

我的第一個想法是dual-dictionary。基本上保持詞典:

Dictionary<int, string> // index-->value 
Dictionary<string, int> // value-->index 

這將是更多的工作,以保持在字典同步,但是如果你在搜索值了很多它可能是值得的。

每次搜索一個值時,使用數組都會需要線性搜索,所以我認爲它不會是最高性能的。

此外,如果你只是不在任何字典中存儲空白/空值,那麼你可以直接綁定到他們,而無需做任何過濾。

0

當然有很多方法可以做到這一點,但您可以創建一個集合類,而不是使用非空字符串封裝SortedDictionary<int, string>

0

我想你要對這個錯誤的方法......你有5MB的內存限制,你要使用拿着空白的字符串整個事情?這個數據結構是否也將在5mb中保存?這限制了您可以容納的字符串數量。這些字符串如何在這個內存中被持久化?某種數據庫?我不知道這是用來做什麼的,但是你真的認爲你的用戶會使用全部100,000個字符串嗎?我非常懷疑這一點。

我也還是不明白的關鍵是如何與字符串值,但它確實沒有意義的,我有10萬名的項目,最有可能是很多這些爲空字符串列表。這是浪費內存,更不用說它會創建的搜索/插入/刪除開銷。只保留目前使用的清單,在考慮速度時更有意義。

我建議如果有可能使用NoSQL數據庫。您可以插入用戶創建的字符串,它爲您提供索引值,並可以隨意更新字符串。如果用戶將字符串刪除/設置爲空字符串,則可以將其從數據庫中刪除(或者,因爲您非常喜歡這個想法,請將其設置爲數據庫中的空字符串)。繼續插入,直到達到您的100,000個字符串限制。