关于c#7.0:在foreach中解构词典

Deconstruction in foreach over Dictionary

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

1
2
3
4
5
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:

0


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

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

然后您将得到一个不同的错误:

0

根据这个答案,您必须安装nuget包System.ValueTuple

然后它应该编译。然而,Visual Studio 2017 RC4将表示它无法解析符号名称nameage。他们希望在将来的更新中修复这个问题。


如果您不喜欢编写Deconstruct方法,特别是当您只需要在一个地方使用它时,下面介绍如何使用linq作为一个单行程序:

使用原始词典:

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

你可以这样做:

2


KeyValuePairDeconstruct在.NET核心2.0中实现,但在.NET框架(多达4.8预览版)中没有实现。