在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:
错误CS1061:'KeyValuePair'不包含'Deconstruct'的定义,并且没有扩展方法'Deconstruct'可以找到接受类型'KeyValuePair'的第一个参数(你是否缺少using指令或汇编引用?)
答案 0 :(得分:27)
首先,您必须为KeyValuePair
添加扩展方法:
public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value)
{
key = tuple.Key;
value = tuple.Value;
}
然后你会得到一个不同的错误:
错误CS8179:预定义类型&#39; System.ValueTuple`2&#39;未定义或导入
根据this answer,您必须安装NuGet包System.ValueTuple
。
然后它应该编译。但是Visual Studio 2017 RC4会说它无法解析符号名name
和age
。他们应该希望在将来的更新中解决这个问题。
答案 1 :(得分:16)
如果您不喜欢编写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.");
}
答案 2 :(得分:6)
Deconstruct
中的KeyValuePair<TKey,TValue>
是implemented in .NET Core 2.0,但不幸的是,它不在.NET Framework(最多4.8个预览版)中。