2012-12-12 125 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个字符串限制。