1

我已经通过以下方式解决了。由于它很长,我需要一个更好的。

//代码

class Program
{
    static void Main(string[] args)
    {
        Hashtable hsTbl = new Hashtable();

        hsTbl.Add(1, "Suhas");
        hsTbl.Add(2, "Madhuri");
        hsTbl.Add(3, "Om");
        List<object> keyList = new List<object>();
        List<object> ValList = new List<object>();

        Console.WriteLine("Key          Value");
        foreach (DictionaryEntry item in hsTbl)
        {
            Console.WriteLine(item.Key + "      " + item.Value);
            keyList.Add(item.Value);
            ValList.Add(item.Key);

        }
        hsTbl.Clear()

//Swapping          

        for (int i = 0; i < keyList.Count; i++)
        {
            hsTbl.Add(keyList[i], ValList[i]);
        }

//will display hashtable after swapping

        foreach (DictionaryEntry item in hsTbl)
        {
            Console.WriteLine(item.Key + "      " + item.Value);
        }
    }
}

还有其他更好的解决方案吗?

4

2 回答 2

1

您可以使用额外的数组和 CopyTo 方法而不是 2 个列表来稍微简单一些,但无需创建额外的 HashTable,如下所示:

//代码

using System;
using System.Collections;

class Program
{
  static void Main()
  {
      Hashtable hsTbl = new Hashtable();

      hsTbl.Add(1, "Suhas");
      hsTbl.Add(2, "Madhuri");
      hsTbl.Add(3, "Om"); 

      DictionaryEntry[] entries = new DictionaryEntry[hsTbl.Count];
      hsTbl.CopyTo(entries, 0);
      hsTbl.Clear();

      foreach(DictionaryEntry de in entries) hsTbl.Add(de.Value, de.Key);

      // check it worked

      foreach(DictionaryEntry de in hsTbl)
      {
         Console.WriteLine("{0} : {1}", de.Key, de.Value);
      }
  }
}

请注意,一般情况下,任何方法都不能保证有效,因为原始哈希表中的某些值可能会重复,因此不适合作为键。

于 2013-03-26T09:59:47.743 回答
1

你可以使用 generic Dictionary<string,int>,这很容易用 Linq 创建:

var dictionary = hsTbl.OfType<DictionaryEntry>()
                      .ToDictionary(e => (string)e.Value, e => (int)e.Key);

如果你真的需要Hashtable,那么:

Hashtable table = new Hashtable();
foreach (DictionaryEntry entry in hsTbl)
    table.Add(entry.Value, entry.Key);

但是,如果要交换值和键,请确保所有值都是唯一的。

于 2013-03-26T10:00:38.843 回答