在字典中解构foreach

时间:2017-03-02 07:44:04

标签: c#-7.0

在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指令或汇编引用?)

3 个答案:

答案 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会说它无法解析符号名nameage。他们应该希望在将来的更新中解决这个问题。

答案 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个预览版)中。