在C#中使用字符串调用哈希表

时间:2012-10-17 08:37:09

标签: c# hashtable

正如您所见,我有GetEdinburgh()调用的哈希表 但是这个程序需要运行可变的时间,每次需要调用不同的哈希表。如何使用GetEdinburgh()等字符串替换GetTown()

static Hashtable GetEdinburgh()
{
    Hashtable hashtable = new Hashtable();
    hashtable.Add("Aberdeen", 129);
    hashtable.Add("Ayr", 79);
    hashtable.Add("Fort_William", 131);
    hashtable.Add("Glasgow", 43);
    hashtable.Add("Inverness", 154);
    hashtable.Add("St_Andrews", 50);
    hashtable.Add("Stirling", 36);
    return hashtable;
}


static void Main(string[] args)
{
    int total = 1000;
    string Town = "";

    Hashtable hashtable = GetEdinburgh(); //how can I change this to a string?
    foreach (DictionaryEntry entry in hashtable)
    {
        if (Convert.ToInt32(entry.Value) < total)
        {
            total = Convert.ToInt32(entry.Value);
            Town = entry.Key.ToString();
        }

    }
    Console.WriteLine(Town + ", " + total + "km");
    Console.ReadLine();
}

我可能没有具体说明我的问题。上面的当前代码工作正常,但我需要扩展它。我需要调用比上面提供的哈希表更多的哈希表,但我不能直接调用它。我需要有一个字符串值,每次实现一个循环来调用一个新的表。但是我无法将system.Collections.hashtable转换为字符串。

2 个答案:

答案 0 :(得分:1)

最好你可以写一个像这样的方法:

static Hashtable GetHashtable(string Table )
    {
        Hashtable hashtable = new Hashtable();
           switch(table)
          {
        case "Edinburgh":
        hashtable.Add("Aberdeen", 129);
        hashtable.Add("Ayr", 79);
        hashtable.Add("Fort_William", 131);
        hashtable.Add("Glasgow", 43);
        hashtable.Add("Inverness", 154);
        hashtable.Add("St_Andrews", 50);
        hashtable.Add("Stirling", 36);
        break;
           ................
        return hashtable;
    }

您可以将字符串传递给方法并获取值。

  
    
      
        
          

如果答案真的回答了你的问题,请点击“答案”。

        
      
    
  

答案 1 :(得分:0)

<强> EDIT2

更简单地说,如果您想使用string键从Hashtable获取匹配值,请执行此操作,

Hashtable distancesFromEdinburgh = GetEdinburgh();
string town = "Ayr";
int distanceFromEdinburghToAyr = distancesFromEdinburgh[town];

修改

答案是最简单的,也是最糟糕的方式,

static HashTable GetTown(string town)
{
    Hashtable hashtable;

    switch(town)
    {
        case "Edinburgh":
            hashtable = new Hashtable();
            hashtable.Add("Aberdeen", 129);
            hashtable.Add("Ayr", 79);
            hashtable.Add("Fort_William", 131);
            hashtable.Add("Glasgow", 43);
            hashtable.Add("Inverness", 154);
            hashtable.Add("St_Andrews", 50);
            hashtable.Add("Stirling", 36);
            break;

            // Other cases here
    }

    return hashtable;
}

好的,不要使用HashTable作为开始。下面的代码使用了许多最新功能,并且与您发布的代码具有相同的功能。

又是什么问题?

private enum Towns
{
    Aberdeen,
    Ayr,
    FortWilliam,
    Glasgow,
    ...
}

private static IDictionary<Towns, int> GetEdinburgh()
{
    return new Dictionary
    {
        { Key = Aberdeen, Value = 129 },
        { Key = Ayr, Value = 79 },
        { Key = FortWilliam, Value = 131 },
        { Key = Glasgow, Value = 43 },
        ...
    };
}

static void Main(string[] args)
{
    var closest = this.GetEdinburgh()
        .Where(p => p.Value < 1000)
        .Min(p => p.Value);

    Console.WriteLine("{0}, {1}km", closest.Key, closest.Value);
    Console.ReadKey();
}

如果你想要一个普通的get town功能,你可以这样声明它。

private static IDictionary<Towns, int> GetTown(Towns town)
{
    switch(town)
    {
        case Towns.Edinburgh:
            return new Dictionary
            {
                { Key = Aberdeen, Value = 129 },
                { Key = Ayr, Value = 79 },
                { Key = FortWilliam, Value = 131 },
                { Key = Glasgow, Value = 43 },
                ...
            }

        case Towns.Ayr
            ...

        ...

        default:
           throw new ArgumentException(
               string.Format("{0} not implemented", town),
               "town"); 
    };
}

此功能的实现方式因存储或定义距离而异。当前的实现假定它们是硬编码的,这种方法很快,但维护起来有点脆弱。

如果您拥有城镇位置的坐标,您可以计算它们之间的距离,“每次通话时乌鸦飞行”。

如果你想要产生一个“真正的”最佳旅行距离,你需要一个地图和一个更复杂的路径寻找算法。

你有什么,你想做什么?