【问题标题】:Calling a hashtable with a string in C#在 C# 中使用字符串调用哈希表
【发布时间】:2012-10-07 11:20:41
【问题描述】:

如您所见,我有一个由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 转换为字符串。

【问题讨论】:

  • 您有包含该信息的文件(或数据库)吗?
  • 你不清楚你的问题,如何描述你想要的输入->输出和方法。
  • 我可以在您的代码中看到您仅显示具有最低 km 的城镇。这是你想要做的吗?并且更清楚你提到的GetTown()
  • 如果可以的话,请使用Dictionary&lt;string, int&gt;
  • 你的意思是multiple还是mutable,你想达到什么目的?

标签: c# hashtable


【解决方案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;
    }

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

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

【讨论】:

  • 我想你错过了理解我的问题。我可以很好地从哈希表中获取信息。但我需要调用其他哈希表而不说 getEndeburg() 或 GetAberdeen()。我正在寻找类似 string Hastablename = getEndeburg() 的东西,然后使用该字符串来调用 hastable。像Hashtable hashtable = Hashtablename,问题是你不能将字符串转换为system.object hashtable
【解决方案2】:

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

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

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

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

你有什么,你想做什么?

【讨论】:

  • 我必须创建一个搜索算法,找到最近的城镇,然后移动到那个城镇以找到他最近的城镇(不能两次移动到同一个城镇。)上面的代码移动到第一个城镇,然后我需要调用一个新的哈希表/或数组来显示新信息。但我不能直接调用它,这就是为什么我问如何用字符串调用哈希表。
  • @user1752505 如果你能提出一个明确的问题我可以回答。
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 2013-04-07
  • 2011-04-28
  • 2011-11-19
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
相关资源
最近更新 更多