2

我正在解析一个测试文件,格式如下:

[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].

如您所见,这些值没有重复(尽管我想考虑未来的欺骗),但键是欺骗。键是连字符 (-) 之前的部分。

但是每次我将这些放入字典时,它都适合并告诉我不允许欺骗。为什么字典不允许欺骗?我该如何克服呢?

4

6 回答 6

1

Dictionary 的 TKey 部分被散列用于快速查找,如果您在其中有欺骗,您将陷入冲突和复杂性,这将降低您快速有效地查找内容的能力。这就是不允许受骗的原因。

您可以使用其中的数据制作一个结构,并将其放在一个Dictionnary<ID, MyStruct>示例中。这样您就可以避免密钥中的欺骗(每个结构都是唯一的,并且您将所有数据都放在字典中。

于 2012-09-06T08:05:51.483 回答
1

字典可以有重复值,但不能有重复值,因为那样你将如何判断你想要哪个键的值。

我怎样才能克服这个

使用 aKeyvaluePair[]但在这种情况下,您将如何判断您想要哪个键的值?

于 2012-09-06T08:06:09.323 回答
1

您可以使用 Wintellect Power Collections 的 MultiDictionary 类。Power Collections 是用于 .Net 2 或更高版本的一组历史悠久的集合类。它已经 5 年没有更新了,但它不需要更新。

见这里: http: //powercollections.codeplex.com/

在这里下载:http: //powercollections.codeplex.com/releases/view/6863

于 2012-09-06T08:32:09.550 回答
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; }
}
于 2012-09-06T08:11:17.990 回答
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);
}
于 2012-09-06T08:07:23.083 回答
0

根据您的问题,我假设您使用 [Name]、[Age] 和 [Favorite Color] 作为键。有很多方法可以使用这些键将数据放入字典中,但真正的问题是如何取回数据?

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

于 2012-09-06T08:19:47.773 回答