Deconstruction in foreach over Dictionary
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.");
}
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.
Deconstruct
of KeyValuePair<TKey,TValue>
is implemented in .NET Core 2.0, but not in .NET Framework (up to 4.8 preview) unfortunately.