0

私は 1 つのマスターDictionary<int, SolarSystem>といくつかの小さなDictionary<int, JumpsHelperClass>,Dictionary<int, KillsHelperClass>などを持っています。私SolarSystemのクラスは、これらの小さなヘルパー クラスJumpsHelperClass,KillsHelperClassなどで構成されています。それらはすべて同じintキーでインデックス付けされています。

問題は、これらの小さな辞書が非同期 API 呼び出しによって取り込まれ、マスターDictionary<int, SolarSystem>サブスクライブを保持する私のマスター クラスが、マスター リストを更新するための新しい情報を取得したときに通知されることです。ただし、マスター リストを更新するときに、小さいリストに含まれるすべてのキーがマスター リストに含まれているという保証はありません。実際、マスター Dictionary は完全に空である可能性があります。

私はこのようなアプローチを試みました:

    void JumpsRequest_UpdatedResults(object sender, EventArgs e)
    {
        foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys)
        {
            try
            {
                SolarSystemsByID[item].Jumps = JumpsRequest.JumpsBySolarSystemID[item];
            }
            catch (KeyNotFoundException ex)
            {
                SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass()));
            }
        }
    }

しかし、これは非常に非効率的です。JumpsRequestこれは、 が API から新しい情報を取得して更新するたびに発生しますDictionary<int, JumpsHelperClass>。マスターに追加するたびにtry catchのオーバーヘッドを回避して、辞書をマージできる方法はありますか?

マスター ディクショナリは、参照用に常に約 4 ~ 8k の要素を保持する傾向があります。

ありがとう。

4

1 に答える 1

0

主な懸念事項が try/catch である場合は、ContainsKey を使用して、更新を試みる前に指定されたキーが存在するかどうかを確認できます。

   void JumpsRequest_UpdatedResults(object sender, EventArgs e)
    {
        foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys)
        {
            if (SolarSystemsByID.ContainsKey(item))
            {
                SolarSystemsByID[item].Jumps = JumpsRequest.JumpsBySolarSystemID[item];
            }
            else
            {
                SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass()));
            }
        }
    }

ディクショナリで 2 回検索するのを避けたい場合 (上記のコードで実行されます)、次のようにすることもできます。

   void JumpsRequest_UpdatedResults(object sender, EventArgs e)
    {
        foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys)
        {
            SolarSystem system;
            if (SolarSystemsByID.TryGetValue(item, out system))
            {
                system.Jumps = JumpsRequest.JumpsBySolarSystemID[item];
            }
            else
            {
                SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass()));
            }
        }
    }
于 2013-02-12T23:34:51.370 に答える