遍历字典键/值对,其中值是一个数组

时间:2019-03-25 16:19:33

标签: c#

我正试图从值是数组的字典中显示键/值对的元素。它是用户名的字典,其中键是代表用户名的字符串,而值是用户属性。我希望将每个键/值对一起列出,因此输出如下:

  

User1(键)
  User1_email
  user1_fullName
  User1_displayName

     

User2(密钥)
  User2_email
  user2_fullName
  User2_displayName
  等等...

但是,我得到的结果是它显示了正确的键,但是仅显示了值的最后一个元素。例如,这是我得到的输出:

  

User1(键)
  User2_email
  user2_fullName
  User2_displayName

     

User2(密钥)
  User2_email
  user2_fullName
  User2_displayName
  等等...

这是我的foreach循环:

foreach (KeyValuePair<string, string[]> entry in userNames)
{
    txtOutput.Text += entry.Key;
    foreach (string value in entry.Value)
    {
        txtOutput.Text += value + Environment.NewLine;
    }
}

嵌套的foreach循环似乎在遍历所有值,而与键无关,但是我只希望它在父foreach循环中遍历与CURRENT键相关联的值。希望我的问题有道理,感谢您的帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

您在注释中提供了以下代码以填充字典:

string[] tempArray = new string[5];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < 6; j++)
    {
        if (j != 0) tempArray[j-1] = userInfo[i, j];
    }
    userNames.Add(userInfo[i, 0], tempArray);
}

您似乎希望通过在for循环外使用单个数组来减少内存使用。但是,这会对您的字典产生意想不到的副作用!

字典将通过引用存储数组。在填充循环的第一次迭代中,您调用usernames.Add(..., tempArray),该实例将tempArray实例分配给第一个用户键。然后,第二次迭代将重复使用相同的数组,并将其分配给下一个用户密钥。由于您没有为每个用户初始化一个新的数组实例,因此实际上您正在将所有键与同一数组相关联。循环的最终迭代将确定此数组的状态。

这应该解决它:

for (int i = 0; i < rows; i++)
{
    string[] tempArray = new string[5];
    for (int j = 0; j < 6; j++)
    {
        if (j != 0) tempArray[j-1] = userInfo[i, j];
    }
    userNames.Add(userInfo[i, 0], tempArray);
}