使用Dictionary <t> </t>在两个嵌套的foreach中转义外部变量陷阱

时间:2012-12-13 14:06:50

标签: variables dictionary foreach nested outer-join

我有两个我初始化的对象:

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].Keyskey类型string)任何{{1} }}可以是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; } 的所有series[key]都等于最后一个series.Keys。我尝试了许多解决方案来逃避外部变量陷阱,根据this article没有运气。有谁知道解决方案或更好的方法?

1 个答案:

答案 0 :(得分: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;
}