2

正如你所看到的,我有一个被调用的哈希表,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();
}

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

4

2 回答 2

0

编辑2

更简单地说,如果您想从 a 中获取匹配值,Hashtablestring执行此操作,

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"); 
    };
}

此函数的此实现将根据您存储或定义距离的方式而有所不同。当前的实现假设它们是硬编码的,这将很快但维护起来有点脆弱。

如果你有城镇位置的坐标,你可以计算它们之间的距离,“就像乌鸦飞一样”在每次通话中。

如果你想生成一个“真实的”最佳行驶距离,你需要一张地图和一个相当复杂的寻路算法。

你有什么,你想做什么?

于 2012-10-17T09:21:23.747 回答
0

更好的是,您可以编写这样的方法:

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;
    }

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

如果答案确实回答了您的问题,请单击已回答。

于 2012-10-17T08:46:21.983 回答