我正试图从值是数组的字典中显示键/值对的元素。它是用户名的字典,其中键是代表用户名的字符串,而值是用户属性。我希望将每个键/值对一起列出,因此输出如下:
User1(键)
User1_email
user1_fullName
User1_displayNameUser2(密钥)
User2_email
user2_fullName
User2_displayName
等等...
但是,我得到的结果是它显示了正确的键,但是仅显示了值的最后一个元素。例如,这是我得到的输出:
User1(键)
User2_email
user2_fullName
User2_displayNameUser2(密钥)
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键相关联的值。希望我的问题有道理,感谢您的帮助。
谢谢
答案 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);
}