問題が発生しました... HTML 形式の 5 つほどのバイリンガル辞書を、ソース言語として英語を使用する 1 つの多言語辞書に統合しようとしています。これを行うために、辞書を設定し、英語以外の各単語を対応する英語の単語 (キー) にマップすることにしました [以下のコードを参照]。
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 ループの各反復の後、既存のディクショナリ値はすべて null になります (ただし、キーは残ります)。したがって、15 行目のループの最初の繰り返しの後、辞書 (「言語」と呼ばれる) には次の内容が含まれていたとしますkey: <word language="EN">Hello</word> Value: <word language="ES">Hola</word>
。2 回目の反復が行われると、値は辞書の「言語」から削除され、次のものだけが残ります。
key: <word language="EN">Hello</word>
Value: null
key: <word language="EN">Goodbye</word>
Value: <word language="ES">Chao</word>
(Goodbye-Chao ペアが 2 回目の繰り返しのキーと値のペアとして渡された場所)。
この奇妙な動作の原因は何ですか...私の知る限り、辞書の値をまったく上書きしていません! 私がどこで間違っているのか誰にも分かりますか?