foreach over Dictionary 中的解构

Deconstruction in foreach over Dictionary

在 C#7 中是否可以在字典的 foreach 循环中使用解构?像这样:

var dic = new Dictionary<string, int>{ ["Bob"] = 32, ["Alice"] = 17 };
foreach (var (name, age) in dic)
{
    Console.WriteLine($"{name} is {age} years old.");
}

它似乎不适用于 Visual Studio 2017 RC4 和 .NET Framework 4.6.2:

error CS1061: 'KeyValuePair' does not contain a definition for 'Deconstruct' and no extension method 'Deconstruct' accepting a first argument of type 'KeyValuePair' could be found (are you missing a using directive or an assembly reference?)

首先你必须为KeyValuePair添加一个扩展方法:

public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value)
{
    key = tuple.Key;
    value = tuple.Value;
}

然后你会得到一个不同的错误:

error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported

根据 ,您必须安装 NuGet 包 System.ValueTuple

然后应该可以编译了。但是 Visual Studio 2017 RC4 会说它无法解析符号名称 nameage。他们应该希望在未来的更新中解决这个问题。

如果您不喜欢必须编写 Deconstruct 方法,尤其是如果您只在一个地方需要它,下面是使用 LINQ 将其作为单行代码的方法:

使用您原来的词典:

var dic = new Dictionary<string, int>{ ["Bob"] = 32, ["Alice"] = 17 };

你可以这样做:

foreach (var (name, age) in dic.Select(x => (x.Key, x.Value)))
{
    Console.WriteLine($"{name} is {age} years old.");
}
不幸的是,KeyValuePair<TKey,TValue>

Deconstructimplemented in .NET Core 2.0,但在 .NET Framework(最高 4.8 预览版)中不是。