在一个System.Collections.Generic.Dictionary<string,string>中枚举键值对

3
在调试时,我想查看我的InitParams集合中的键是什么-我似乎无法列出它们。
编辑:
正如Jon在下面建议的那样,这可能是Silverlight调试器内部的一个错误。要重现,只需在Visual Studio 2010中创建一个新的Silverlight应用程序bug silverlight然后编辑代码。
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            var dictionary = new Dictionary<string, string> {{"A", "1"}, {"B", "2"}, {"C", "3"}};
        }
    }
}
2个回答

4
假设你只需要键值,使用 Keys 属性:
foreach (string key in dict.Keys)
{
    ...
}

如果您想在立即窗口中以易于阅读的方式获取所有键,则可以使用以下代码:
string.Join(";", dict.Keys)

如果是4.0之前的版本:

string.Join(";", dict.Keys.ToArray())

如果您使用的是.NET 2,则可以按照以下方式进行:

string.Join(";", new List<string>(dict.Keys).ToArray())

如果您想同时获取值,可以按照Yaakov的回答迭代KeyValuePair条目。
编辑:说实话,我本来期望Visual Studio默认会向您显示字典的美观表示。例如,这是我在VS2008中看到的内容:
... 我刚刚在VS2010中尝试了一下,并看到了同样的结果。在调试常规选项下,您是否勾选了“在变量窗口中显示对象的原始结构”?如果是,请取消勾选。

那我必须重新编译我的应用程序吗?难道我不能在调试器、即时窗口或其他我想不到的地方随机检查集合的内容吗? - ebcrypto
1
@bmanu:不,您不必重新编译应用程序。该string.Join表达式可以在监视窗口中工作。但我很惊讶您在Visual Studio中没有看到字典的漂亮形式...您使用的是哪个版本的VS? - Jon Skeet
VisualStudio 2010。你是在寻找更精确的答案吗?感谢你的帮助! - ebcrypto
e.InitParams.Keys.ToArray() 'System.Collections.Generic.ICollection<string>' 不包含 'ToArray' 的定义,也没有找到接受类型为 'System.Collections.Generic.ICollection<string>' 的第一个参数的扩展方法 'ToArray'(是否缺少 using 指令或程序集引用?) - ebcrypto
@bmanu:我假设你已经在使用LINQ了。你的.NET版本是哪个? - Jon Skeet
显示剩余3条评论

1

编程方式:

foreach (KeyValuePair<string,string> param in InitParams) {
  Debug.Writeline(param.Key + ": " + param.Value);
}

在调试器中,向下浏览到InitParams > Values > Non-Public members > dictionary。它最终应该会显示出来。
在Immediate窗口中,尝试类似InitParams["abc"]的内容,以显示第一项的值,其中"abc"是集合中已知的键。如果您不知道集合中键的名称,则使用上述编程方法将所有值写入Debug窗口。

我实际上想在调试器中执行此操作。即时窗口是理想的选择。 - ebcrypto
e.InitParams[0] 返回: “System.Collections.Generic.IDictionary<string,string>.this[string]” 的最佳重载方法匹配存在一些无效的参数。 - ebcrypto
是的,这不起作用,因为InitParams[]期望一个字符串(需要对应于集合中的一个键)。请参见上面更正后的文本。 - Yaakov Ellis
我同意,我可以做到这一点。但是我真的不想重新编译。谢谢! - ebcrypto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接