任何可以处理欺骗的字典?

时间:2012-09-06 08:02:42

标签: c# .net

我正在解析测试文件,格式为:

[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。为什么字典不允许欺骗?我怎么能克服这个?

6 个答案:

答案 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>>