组合哈希表和写入文件

时间:2011-07-08 19:38:38

标签: c#

我有2个已创建的哈希表。在这两个哈希表中,它们都具有相同的密钥,但具有不同的值。我已经使用排序列表对两个哈希表进行了排序,以便在两个表上按顺序排列密钥。我试图做的是将两个哈希表写入文本文件,并在此文本文件中,它将具有哈希表1中的值和哈希值中的键(两个哈希表中相同)旁边的表2。数据由TAB分隔,看起来如下所示:

Key Value  Value
128   123      6
143   255      4
Hashtable frequency = new Hashtable();
Hashtable grouplist = new Hashtable();

SortedList Grp = new SortedList (grouplist);
SortedList Freg = new SortedList(frequency);

foreach (DictionaryEntry entry in Grp)
{
    foreach (DictionaryEntry maxval in Freq)
    {
            file.Write(entry.Key);
            file.Write("\t");
            file.Write(entry.Value);
            file.Write("\t");

            if(Freq[entry.Key].Equals(Grp[maxval.Key]))
            {
                file.WriteLine(maxval.Value);
            }
     }
}

我已经尝试了很多方法让它只从一个哈希表中写出Key和Value以及从第二个哈希表中写出值,但它只重复写入每个键75次(这是键的总数Hash表。

我有上述代码的许多变体,它们都做同样的事情(如果需要可以发布它们)。任何帮助将不胜感激。

此外,我能让它工作并写下所需的东西(每次75次)的唯一方法是,如果我放一个 - ! - 在if语句中,即使两个键都相同。我甚至检查过以确保在调试程序时它们是相同的。 - 谢谢

4 个答案:

答案 0 :(得分:1)

理想情况下,您应该将两个哈希表封装到一个哈希表中(然后您不必担心不一致,并且维护哈希表的代码更容易)。除非:

SortedList frequencies = new SortedList(frequency);
foreach(var entry in frequencies) {
    file.WriteLine(
        String.Format(
            "{0}\t{1}\t{2}",
            entry.Key,
            frequency[entry.Key],
            grouplist[entry.Key]
        )
    );
}

答案 1 :(得分:1)

问题是你循环75 x 75次。这就像你的代码就像......

for (each of the 75 elements in one sorted lists)
    for (each of the 75 elements in the other sorted list)

你想要做的只是在你的一个集合上循环,使用它的Key来索引到另一个集合,就像这样......

foreach (DictionaryEntry entry in Grp)
    var Key = entry.Key;
    file.Write(Key);
    file.Write("\t");
    file.Write(frequency[Key].Value);
    file.Write("\t");
    file.Write(groupList[Key].Value);
    file.Write("\t");

答案 2 :(得分:0)

你有没有试过这样的事情:

foreach (DictionaryEntry entry in Grp)
{
    file.Write(entry.Key);
    file.Write("\t");
    file.Write(entry.Value);

    if (Freq.ContainsKey(entry.Key))
    {
        file.Write("\t");
        file.Write(Freq[entry.Key]);
    }

    file.WriteLine();
 }

基本上,对于Grp中的每个项目,请将其写入文件。如果Freq包含匹配的密钥,请将Freq中的值写入文件。我还考虑了你的WriteLine电话,以便它始终发生(在你的样本中没有)。

我没有测试过这个,但也许它会给你一些东西继续。

答案 3 :(得分:0)

我不知道,为什么你要使用两个foreach循环。我已将代码更改为:

    Hashtable frequency = new Hashtable();
    Hashtable grouplist = new Hashtable();
    SortedList Grp = new SortedList(grouplist);
    foreach(DictionaryEntry entry in Grp) {
        file.Write(entry.Key);
        file.Write("\t");
        file.Write(entry.Value);
        file.Write("\t");
        object maxVal = grouplist[entry.Key];
        if(maxVal != null)
            file.WriteLine(maxVal);
        file.WriteLine();
    }