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

私は自分の問題について具体的ではなかったかもしれません。上記の現在のコードは問題なく動作しますが、拡張する必要があります。上記のハッシュ テーブルよりも多くのハッシュ テーブルを呼び出す必要がありますが、直接呼び出すことはできません。新しいテーブルを呼び出すためにループが実装されるたびに変化する文字列値が必要です。しかし、文字列に変換できませんsystem.Collections.hashtable

4

2 に答える 2

0

EDIT2

さらに簡単に言えば、キーHashtableを使用して aから一致する値を取得したい場合は、次のようにします。string

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 に答える