0

所以我有一个问题......我正在尝试将 5 个左右的双语词典以 HTML 格式合并为一个单一的多语言词典,以英语作为源语言。为此,我决定建立一个字典,并将每个非英语单词映射到它的英语对应项(键)[见下面的代码]。

1 public void ConsolidateDictionary(string directoryPath)
2 {
3    DirectoryInfo directory = new DirectoryInfo(directoryPath);
4    string key = string.Empty;
5    string value = string.Empty;
6    Dictionary<string, List<string>> languages = 
         new Dictionary<string, List<string>>();
7    List<string> temp = new List<string>();
8    foreach (FileInfo file in directory.EnumerateFiles())
9    {
10       HtmlDocument doc = new HtmlDocument();
11       doc.Load(file.FullName);
12
13       foreach (HtmlNode node in doc.DocumentNode.SelectNodes(".//wordunit"))
14       {
15          foreach (HtmlNode child in node.SelectNodes(".//word"))
16           {
17                   if (child.Attributes["language"].Value == "EN")
18                   {
19                       key = child.OuterHtml.ToString();
20                   }
21                   else
22                   {
23                       value = child.OuterHtml.ToString();
24                   }
25           }
26
27           if (key != null && value != null)
28           {
29               if (languages.ContainsKey(key))
30               {
31                   foreach (var item in languages[key])
32                   {
33                       temp.Add(item);
34                   }
35                   temp.Add(value);
36                   languages.Remove(key);
37                   languages.Add(key, temp);
38                   temp.Clear();
39               }
40               else
41               {
42                       temp.Add(value);
43                       languages.Add(key, temp);
44                       temp.Clear();
45               }
46           }
47       }
48   }
49   WriteFile(languages);
50 }

基本上发生的事情是,在第 15 行的 foreach 循环的每次迭代之后,现有的字典值都被清空(但键仍然存在)。因此,假设在第 15 行循环的第一次迭代之后,字典(称为“语言”)包含key: <word language="EN">Hello</word> Value: <word language="ES">Hola</word>:当第二次迭代到来时,该值将从字典“语言”中删除,只留下:

key: <word language="EN">Hello</word>
Value: null
key: <word language="EN">Goodbye</word>
Value: <word language="ES">Chao</word>

(Goodbye-Chao 对作为第二次迭代的键值对传入)。

是什么导致了这种奇怪的行为……据我所知,我根本没有覆盖字典中的值!有谁知道我哪里出错了?

4

2 回答 2

3
temp.Add(value);
 //languages.Add(key, temp);
temp.Clear();

看看你对那个可怜的 List 实例做了什么。为每个键使用一个新的 List 实例。


if (!languages.ContainsKey(key))
{
  languages.Add(key, new List<string>())
}
languages[key].Add(value);
于 2012-06-28T17:24:54.910 回答
2

您正在为每个键设置 temp 值。您想在每次分配 temp 时为其创建一个新对象。一旦你打电话清除,你就会在每件物品上擦拭它。

您一直在使用相同的列表。因此,您将项目添加到第一个键,然后将其清除。这将清除您放入该值的所有内容。

固定的:

public void ConsolidateDictionary(string directoryPath)
{
   DirectoryInfo directory = new DirectoryInfo(directoryPath);
   string key = string.Empty;
   string value = string.Empty;
   Dictionary<string, List<string>> languages = new Dictionary<string, List<string>>();
   List<string> temp = null;
   foreach (FileInfo file in directory.EnumerateFiles())
   {
       HtmlDocument doc = new HtmlDocument();
       doc.Load(file.FullName);

       foreach (HtmlNode node in doc.DocumentNode.SelectNodes(".//wordunit"))
       {
          foreach (HtmlNode child in node.SelectNodes(".//word"))
           {
                   if (child.Attributes["language"].Value == "EN")
                   {
                       key = child.OuterHtml.ToString();
                   }
                   else
                   {
                       value = child.OuterHtml.ToString();
                   }
           }

           if (key != null && value != null)
           {
               if (languages.ContainsKey(key))
               {
                if(languages[key].Items.Contains(value) == false)
                         languages[key].Add(value);
               }
               else
               {
                    languages.Add(key, new List<string>);
                    languages[key].Add(value);
               }
           }
       }
   }
   WriteFile(languages);
 }
于 2012-06-28T17:25:15.860 回答