0

我正在尝试填充一个字典,其中唯一的主题值具有应该与之匹配的各种代码值。

CODE    SUBJECT

7DIM-062  Recruitment and Selection

7DIM-063    Recruitment and Selection

7DIM-064    Recruitment and Selection

7DIM-065    Recruitment and Selection

7DIM-066    Recruitment and Selection

7DIM-067    Recruitment and Selection

7DIM-068    Recruitment and Selection

所以我想要的只是将 Reqruitment 和 Selection 作为唯一键添加到 Dictionary 中,然后将所有相应的代码添加到 List 中。我该怎么做呢?

Dictionary<string, List<string>> dict = new Dictionary<string,List<string>>();

这是我的查询

OleDbDataReader dbReader = cmd.ExecuteReader();
while (dbReader.Read())
{
    string code = (string)dbReader["CODE"];
    string subject = (string)dbReader["SUBJECT"];
    //???? this is the point where I would want to add the values
    dict.Add(subject, new List<string>().Add(code);
4

3 回答 3

5

首先检查您的字典是否已经有密钥,如果没有,则在List初始化时添加新密钥。

if (!dict.ContainsKey(subject))
{
    dict[subject] = new List<string>();    
}

dict[subject].Add(code);
于 2013-02-12T12:22:19.413 回答
2

您可以使用Dictionary.TryGetValue来查看您的字典是否已包含该主题。然后你可以添加新的代码,否则添加主题+代码:

Dictionary<string, List<string>> dict = new Dictionary<string,List<string>>();
while (dbReader.Read())
{
    string code = (string)dbReader["CODE"];
    string subject = (string)dbReader["SUBJECT"];

    List<string> codes;
    if (dict.TryGetValue(subject, out codes))
    {
        codes.Add(code);
    }
    else
    {
        codes = new List<string>() { code };
        dict.Add(subject, codes);
    }
}

它比查找两次更有效。

此方法结合了 ContainsKey 方法和 Item 属性的功能。如果未找到键,则 value 参数获取类型 TValue 的适当默认值;例如,整数类型为 0(零),布尔类型为 false,引用类型为 null。如果您的代码经常尝试访问不在字典中的键,请使用 TryGetValue 方法。使用此方法比捕获 Item 属性抛出的 KeyNotFoundException 更有效。此方法接近 O(1) 操作。

于 2013-02-12T12:25:13.013 回答
2

您可以使用查找<string, string>

var subjects = new List<KeyValuePair<string, string>>();
while (dbReader.Read())
{
    string code = (string)dbReader["CODE"];
    string subject = (string)dbReader["SUBJECT"];

    subjects.Add(new KeyValuePair<string, string>(subject, code));
}
// ...
var lookup = subjects.ToLookup(x => x.Key, x => x.Value);
var recruitmentAndSelectionCodes = lookup["Recruitment and Selection"].ToList();
// returns
//     7DIM-062 
//     7DIM-063 
//     etc. 
于 2013-02-12T12:32:27.800 回答