如何循环遍历这个字典

3
我已经声明了一个字典,就像这样:

Dictionary<string, KeyValuePair<string, string>> dc = new Dictionary<string, KeyValuePair<string, string>>();

现在我该如何循环遍历它?我想要像下面这样的东西,所以我创建了那个字典:

名称1 旧值1 新值1

名称2 旧值2 新值2

...


你能解释一下这个字典是干什么用的吗?将一个键映射到一个键值对可能有点奇怪。也许有更好的数据结构可以实现你想要的功能。"旧"和"新"值实际上是键和值吗?听起来旧值不像是一个键,而更像是一个值。 - Eric Lippert
如果您正在使用C# 4.0,应该使用Tuple<string, string>而不是KeyValuePair<>(除非您明确地重复使用另一个字典的KeyValuePair)。 - xanatos
@NullUserExceptionఠ_ఠ:是的,你关于存储旧值和新值的想法是正确的。 - Bohn
@BDotA 你说得对... 我也做了很多次,但我不想记住它们 :-) - xanatos
4
将一个值放在名为“Key”的字段中似乎是危险且容易出错的。结构体很便宜;你为什么不建立一个struct Replacement<T> { public T OldValue { get; private set; } public T NewValue { get; private set; } ...}并使用它呢?我曾经花费数小时调试代码,因为有些笨蛋决定将矩形的左、上、宽度和高度存储在一个名为left、top、right、bottom的结构体字段中,因为他太懒了,没有定义正确的名称的结构体。这非常难调试,因为一半的名称都是错误的。 - Eric Lippert
显示剩余4条评论
2个回答

6
你可以像这样循环遍历:

foreach (var pair in dc)
{
    string name = pair.Key;
    string oldValue = pair.Value.Key;
    string newValue = pair.Value.Value;

    // use the values 
}

但我感觉你在使用错误的工具。对我来说,听起来你真的需要定义一个适当的类来保存名称和值,然后只是使用该类的 List<T>


太好了!你说得对,使用类而不是字典的方法,这样我之前问的问题:http://stackoverflow.com/questions/7615640/what-is-a-good-structure-to-save-this-data/7616037#7616037 就可以解决了。 - Bohn
你可以使用 Tuple<> 类,而不是创建自己的类(如果你像我一样懒惰的话 :))。 - SaguiItay
@SaguiItay:是的,元组(Tuple)是更好的选择,但它只存在于.NET 4.0及以上版本,而其他团队成员仍然安装着VS2008。 - Bohn
1
@Saguiltay,Tuple<>的问题类似于Dictionary方法的问题。如果你在方法内部使用它作为实现细节,而且没有其他人需要看到它,那么你可以继续使用它。如果你开始传递它给其他方法使用,那么肯定是时候对它进行类处理了,这样它就可以自我记录包含的内容。tuple.Item1tuple.Item2对我来说毫无意义,而theClass.NametheClass.SomeValue则可以告诉我很多信息。 - Anthony Pegram
1
即使不传递它,一个类通常是必要的,因为它为那些在6个月后回到代码并且不知道作者意图的.Item1.Item2.Key.Value.Key.Value.Value提供了文档。不要犹豫使用类,即使对于“琐碎”的东西也是如此。 - Anthony Pegram

5
foreach( KeyValuePair<string, string> kvp in  dc )
{
    Console.WriteLine("Key = {0}, Value = {1}",  kvp.Key, kvp.Value);
}

当您循环字典时,使用的是通用的KeyValuePair。由于您的字典将键和值都作为字符串包含,因此这个通用方法也会同时接受两个字符串。
您可以通过kvp.Key获取键,通过kvp.Value获取值。
对于您的示例,您正在使用一个包含KeyValuePair值的字符串字典。因此,您可以使用以下代码获得所需的精确打印输出:
foreach( KeyValuePair<string, KeyValuePair<string,string>> kvp in  dc )
{
    Console.WriteLine(kvp.Key + " " + kvp.Value.Key + " "+ kvp.Value.Value);
}

只有在添加 dc.Values 时才有效。 - xanatos
他的字典值不是一个 string,而是一个 KeyValuePair<string, string> - CD..
你知道的,还是错了。第二部分应该是KeyValuePair<string, KeyValuePair<string, string>>。 - xanatos

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