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 会说它无法解析符号名称 name
和 age
。他们应该希望在未来的更新中解决这个问题。
如果您不喜欢必须编写 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>
的 Deconstruct
是 implemented in .NET Core 2.0,但在 .NET Framework(最高 4.8 预览版)中不是。
在 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
根据 System.ValueTuple
。
然后应该可以编译了。但是 Visual Studio 2017 RC4 会说它无法解析符号名称 name
和 age
。他们应该希望在未来的更新中解决这个问题。
如果您不喜欢必须编写 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>
的 Deconstruct
是 implemented in .NET Core 2.0,但在 .NET Framework(最高 4.8 预览版)中不是。