我正在解析测试文件,格式为:
[Person]: [Name]-[John Doe], [Age]-[113], [Favorite Color]-[Red].
[Person]: [Name]-[John Smith], [Age]-[123], [Favorite Color]-[Blue].
[Person]: [Name]-[John Sandles], [Age]-[133], [Favorite Color]-[Green].
[Person]: [Name]-[Joe Blogs], [Age]-[143], [Favorite Color]-[Khaki].
正如你所看到的,这些值并不重复(虽然我想考虑未来的欺骗),但是密钥是欺骗。键是连字符( - )之前的部分。
但是每当我把它们变成一个字典时,它就会很合适并且告诉我不允许使用dupes。为什么字典不允许欺骗?我怎么能克服这个?
答案 0 :(得分:1)
字典的TKey部分被哈希用于快速查找,如果你在那里有欺骗,你将陷入冲突和复杂性,这将降低你快速有效地查找事物的能力。这就是为什么不允许欺骗的原因。
您可以在其中创建包含数据的结构,并将其放在Dictionnary<ID, MyStruct>
中。这样就可以避免密钥中的欺骗(这对于每个结构都是唯一的,并且您在字典中拥有所有数据。
答案 1 :(得分:1)
字典可以有值欺骗,但不能在密钥中使用欺骗,因为那样你怎么知道你想要哪个密钥值。
我怎样才能克服这个
使用KeyvaluePair[]
,但在这种情况下,您还将如何判断您想要哪个键的价值?
答案 2 :(得分:1)
您可以使用Wintellect Power Collections的MultiDictionary类。 Power Collections是.Net 2或更高版本的一套历史悠久的集合类。它尚未更新5年,但不一定是。
见这里:http://powercollections.codeplex.com/
在此处下载:http://powercollections.codeplex.com/releases/view/6863
答案 3 :(得分:0)
最简单的方法是使用Dictionary<string, List<string>>
。
用法:
foreach(var person in persons)
{
List<string> list;
if(!dict.TryGetValue(person.Key, out list)
{
list = new List<string>();
dict.Add(person.Key, list);
}
list.Add(person.Data);
}
答案 4 :(得分:0)
Lookup<TKey, TElement>
命名空间中的 System.Linq
类表示每个映射到一个或多个值的键集合。更多信息:MSDN
List<Person> list= new List<Person>();
// ...
var lookup = list.ToLookup(person => person.Key, person => new {Age=person.Age, Color=person.Color});
IEnumerable<Person> peopleWithKeyX = lookup["X"];
public class Person
{
public string Key { get; set; }
public string Age { get; set; }
public string Color { get; set; }
}
答案 5 :(得分:0)
根据您的问题,我认为您使用[名称],[年龄]和[收藏颜色]作为键。有很多方法可以使用这些键将数据放入字典中,但真正的问题是如何将其恢复?
Dictionary中的键应该是唯一的,因此您需要找到一些独特的数据才能将其用作键。 在您的情况下,测试文件看起来像人员列表,其中每行包含人员的数据。因此,最自然的方法是编写一个字典,其中包含有关“唯一数据”应该是人名的人的行,除非它没有重复。
在现实生活中,人的名字通常是一个糟糕的选择,(不仅因为它可能会随着时间的推移而改变,而且因为相同名字的概率非常高),因此使用了人工密钥(行号) ,Guids等。)
修改我看到有多少属性可能会有所不同。所以你需要使用嵌套的词典。外 - 为'人'和内在的人物:
Dictionary<string, Dictionary<string, string>> person_property_value;
但是为了使您的数据结构更容易理解,您应该将内部字典放在Person类中:
class Person{
public readonly Dictionary<string, string> props;
public Person()
{
props = new Dictionary<string, string>();
}
}
现在将Person添加为:
Person p = new Person();
p.props['Name'] = 'John Doe';
p.props['Age'] = 'age';
dictionary.Add('John Doe', p);
并将其恢复为:
Person p = dictionary[Name];
现在允许多个人使用相同的名称,将字典声明为Dictionary<string, List<Person>>