问题
Is it possible in C#7 to use deconstruction in a foreach-loop over a Dictionary? Something like this:
var dic = new Dictionary<string, int>{ ["Bob"] = 32, ["Alice"] = 17 };
foreach (var (name, age) in dic)
{
Console.WriteLine($"{name} is {age} years old.");
}
It doesn't seem to work with Visual Studio 2017 RC4 and .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?)
回答1:
First you have to add an extension method for KeyValuePair
:
public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value)
{
key = tuple.Key;
value = tuple.Value;
}
Then you will get a different error:
error CS8179: Predefined type 'System.ValueTuple`2' is not defined or imported
According to this answer you have to install the NuGet package System.ValueTuple
.
Then it should compile. However Visual Studio 2017 RC4 will say that it cannot resolve the symbol names name
and age
. They should hopefully fix this in a future update.
回答2:
If you don't like having to write the Deconstruct
method, especially if you only need it in one place, here's how to do it as a one-liner with LINQ:
Using your original dictionary:
var dic = new Dictionary<string, int>{ ["Bob"] = 32, ["Alice"] = 17 };
You can do it like this:
foreach (var (name, age) in dic.Select(x => (x.Key, x.Value)))
{
Console.WriteLine($"{name} is {age} years old.");
}
回答3:
Deconstruct
of KeyValuePair<TKey,TValue>
is implemented in .NET Core 2.0, but not in .NET Framework (up to 4.8 preview) unfortunately.
来源:https://stackoverflow.com/questions/42549491/deconstruction-in-foreach-over-dictionary