0

問題が発生しました... 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 回目の繰り返しのキーと値のペアとして渡された場所)。

この奇妙な動作の原因は何ですか...私の知る限り、辞書の値をまったく上書きしていません! 私がどこで間違っているのか誰にも分かりますか?

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 を割り当てるたびに新しいオブジェクトを作成したいとします。clear を呼び出すと、すべてのアイテムで消去されます。

ずっと同じリストを使用しています。したがって、最初のキーにアイテムを追加してから、それをクリアします。これにより、その値に入力したすべてがクリアされます。

修理済み:

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 に答える