使用多个相同键轻松查找值的最佳集合类型是什么?
我有如下的文本文档,其中包含单个和多个变量:
title:: Report #3
description:: This is the description.
note:: more information is available from marketing
note:: time limit for this project is 18 hours
todo:: expand the outline
todo:: work on the introduction
todo:: lookup footnotes
我需要迭代此文本文档的行并填充 <具有这些变量的strong>集合,目前我正在使用字典:
public Dictionary<string, string> VariableNamesAndValues { get; set; }
但这不适用于多个、相同上例中的“note”和“todo”等键,因为键在字典中必须是唯一。
什么是最好的集合,这样我不仅可以获得像这样的单个值:
string variableValue = "";
if (VariableNamesAndValues.TryGetValue("title", out variableValue))
return variableValue;
else
return "";
而且我还可以获得像这样的多个值:
//PSEUDO-CODE:
List<string> variableValues = new List<string>();
if (VariableNamesAndValues.TryGetValues("note", out variableValues))
return variableValues;
else
return null;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您的键和值是字符串,则使用 NameValueCollection< /a>.它支持给定键的多个值。
这不是世界上最高效的收集。特别是因为它是一个非泛型类,使用了大量虚拟方法调用,并且 GetValues 方法将为其返回值分配数组。但除非您需要最好的性能集合,否则这肯定是最方便的集合,可以满足您的要求。
If your keys and values are strings then use a NameValueCollection. It supports multiple values for a given key.
It's not the most efficient collection in the world. Particularly because it's a non-generic class, uses a lot of virtual method calls, and the GetValues method will allocate arrays for its return values. But unless you require the best performing collection, this is certainly the most convenient collection that does what you ask.
您可以制作 key: 字符串和 value: 字符串列表的字典
Dictionary>
EDIT 1 & 2:
如果您可以使用 .NET 3.0 或更高版本,我想到了更好的解决方案。
这是一个 LINQ 示例(我在没有 Visual Studio 的情况下输入了它,所以我希望它能够编译;)): 对
上面示例的简短说明:
结果LINQ 查询是
IQueryable>>
。结果中的每个项目都有一个
Key
属性,其中包含该行的键(标题、说明、注释...)。可以枚举包含所有值的每个项目。
You can make a Dictionary of key: string and value: List of String
Dictionary<string,List<string>>
EDIT 1 & 2:
I've thought of a better solution if you can use .NET 3.0 or higher.
Here's a LINQ example (I typed it without Visual Studio, so I hope it compiles ;)):
A short explanation of the example above:
The result of the LINQ query is a
IQueryable<IGrouping<string, IEnumberable<string>>>
.Each item in the result has a
Key
property containing the key of the line (title, description, note, ...).Each item can be enumerated containing all of values.
您可以使用
Lookup
:请注意,此集合是只读的
You could use a
Lookup<TKey, TElement>
:Note that this collection is read-only
您可以使用 PowerCollections,它是一个开源项目,具有可以解决您的问题的 MultiDictionary 数据结构。
这是如何使用它的示例。
注意:Jon Skeet 之前在回答这个问题时建议过这一点。
You may use PowerCollections which is an open source project that has a MultiDictionary data structure which solves your problem.
Here is a sample of how to use it.
Note: Jon Skeet suggested it before in his answer to this question.
我不是 c# 专家,但我认为
Dictionary>
或某种
HashMap>
可能工作。例如(Java伪代码):
aKey aValue
aKey anotherValue
或类似的东西。
(或者,最短路线:
I'm not a c# expert, but I think
Dictionary<string, List<string>>
or some kind of
HashMap<string, List<string>>
might work.For example (Java pseudocode):
aKey aValue
aKey anotherValue
or something similar.
(or, the shortest way:
我过去曾使用
Dictionary>
来获取多个值。我很想知道是否有更好的东西。以下是如何模拟仅获取一个值的方法。
I have used
Dictionary<string, HashSet<string>>
for getting multiple values in the past. I would love to know if there is something better though.Here is how you can emulate getting only one value.