寻找替代方案以取代List<KeyValuePair<string, KeyValuePair<string, string>>>的数据结构

5
最终得到了这个糟糕的数据结构:
List<KeyValuePair<string, KeyValuePair<string, string>>>

这段文本的翻译如下:

它不太可能变得非常庞大(我估计小于1K),我将一遍又一遍地迭代这个列表。

有没有人能想到一些更好的内置类型的替代方案?


1
回答这个问题可能会有所帮助:https://dev59.com/UHVD5IYBdhLWcg3wE3No - Timothy Carter
2个回答

10
struct MrStruct
{
   public string Key1,
   public string Key2,
   public string Value1
}


List<MrStruct>;

假设您像迭代一样顺序访问列表。可能会有其他数据结构更适合搜索。


你正在进行什么类型的查询?如果Key1是唯一的,使用字典会快得多... - Reed Copsey
根据几个不同的因素,您可以按Key1对键进行排序,并假设Key1是唯一的,然后在其上执行二分搜索,这将为您提供近似o(log n)的搜索时间。由于您的数据也是列表而不是哈希表之类的东西,我认为这将是您可以执行的最快搜索。 - kemiller2002
Key1不是唯一的(否则会选择字典)。 - JohnIdol
Kevin,使用结构体的原因是什么?我知道KeyValuePair是一个结构体,但这确实会有性能损失 - Ben
这完全取决于你想用它来做什么。性能损失可以忽略不计,从大局来看,类和结构体几乎永远不应该被比较用于性能优化。真正应该问的是,“我需要它作为引用传递还是值传递?” - kemiller2002
显示剩余5条评论

10

最好的选择是自己包装一个Tuple类,就像.NET 4.0中提供的那个一样。

这样你就可以拥有一个单一的:

List<Tuple<string,string,string>>

这在.NET 2.0中非常容易编写 - 它基本上只是三个值的组合,而不是在一个KeyValuePair中有两个值。然而,在.NET 2.0中没有内置的三元值等效物。


编辑:

在阅读您在另一篇帖子中有关查询的评论后,我认为还应该提到以下内容 -

即使key1中没有唯一值,您仍可以通过使用以下方法极大地加速任何类型的查询/搜索:

Dictionary<string, List<KeyValuePair<string,string>>>

那么,不要存储单个KeyValuePair,而是通过第一个元素中的密钥查找它们的列表。如果您需要查找具有给定第一个键的所有元素,则这将快得多...


我喜欢字典版本——我也想到了一些类似分组的方法——现在该字符串作为键,我可能会多次搜索该字典。 - JohnIdol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接