0

次のように初期化する 2 つのオブジェクトがあります。

var series = new Dictionary<string,Dictionary<string,int>>()
{
   {"0", new Dictionary<string, int>() },
   {"1", new Dictionary<string, int>() },
   {"2", new Dictionary<string, int>() }
}

var periodValues = new Dictionary<string,int>();
{
   {"Jan", 0 },
   {"Feb", 0 },
   {"Mar", 0 }
}

次に、値が入力された別のオブジェクトがあります。

 var target = new Dictionary<string,Dictionary<string,int>>()
 {
       { "0", 
         new Dictionary<string, int>()
         {
            {"Jan", 12 },
            {"Mar", 22 }
         } 
       },
       { "1", 
         new Dictionary<string, int>()
         {
            {"Mar", 37 }
         } 
       },
       { "2", 
         new Dictionary<string, int>()
         {
            {"Jan", 4 },
            {"Feb", 48 },
            {"Mar", 22 }
         } 
       }
 }

seriestarget常に同じ を持ちますが、Key(target[key].Keysタイプkeystring使用して) 任意の は のサブセット(せいぜい同じ) にkeyすることができます。periodValues.Keys

series.Valuesここで、のキーに従って入力したいのですperiodValues.Keysが、の値を入力しますtarget[key].Value。したがって:

foreach (var numberValue in target.Keys)
{
    foreach (var period in target[numberValue].Keys)
    {
        periodValues[period] = target[numberValue][period];
    }
    series[numberValue] = periodValues;
}

しかし、私は外部変数トラップに陥ります...つまり、 all series[key]for anyseries.Keysは last に等しいperiodValues. この記事に従って、外部変数トラップを回避するために多くの解決策を試しましたが、うまくいきませんでした。誰かが解決策やより良いアプローチを知っていますか?

4

1 に答える 1

0

誰かが興味を持っている場合periodValuesは、最初の内部で宣言して初期化することで問題を解決しましたforeach:

foreach (var numberValue in target.Keys)
{
    var periodValues = new Dictionary<string,int>();
    {
       {"Jan", 0 },
       {"Feb", 0 },
       {"Mar", 0 }
    }
    foreach (var period in target[numberValue].Keys)
    {
        periodValues[period] = target[numberValue][period];
    }
    series[numberValue] = periodValues;
}
于 2012-12-14T09:50:38.463 に答える