猿问

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

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


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 键关联的值。希望我的问题是有道理的,任何帮助表示赞赏


catspeake
浏览 97回答 1
1回答

慕码人2483693

您在评论中提供了以下代码以填充您的字典:string[] tempArray = new string[5];for (int i = 0; i < rows; i++){&nbsp; &nbsp; for (int j = 0; j < 6; j++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (j != 0) tempArray[j-1] = userInfo[i, j];&nbsp; &nbsp; }&nbsp; &nbsp; userNames.Add(userInfo[i, 0], tempArray);}看起来您希望通过在 for 循环之外使用单个数组来减少内存使用量。但是,这会对您的字典产生意想不到的副作用!字典将通过引用存储数组。在填充循环的第一次迭代中,您调用usernames.Add(..., tempArray)which 将tempArray实例分配给第一个用户键。然后第二次迭代重新使用相同的数组并将其分配给下一个用户密钥。由于您没有为每个用户初始化一个新的数组实例,因此您实际上是将所有键与同一个数组相关联。循环的最后一次迭代将决定这个数组的状态。这应该解决它:for (int i = 0; i < rows; i++){&nbsp; &nbsp; string[] tempArray = new string[5];&nbsp; &nbsp; for (int j = 0; j < 6; j++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (j != 0) tempArray[j-1] = userInfo[i, j];&nbsp; &nbsp; }&nbsp; &nbsp; userNames.Add(userInfo[i, 0], tempArray);}
随时随地看视频慕课网APP
我要回答