Is it possible to use named Tuple with generic type declaration?

Viewed 4886

I know we can declared a named tuples like:

var name = (first:"Sponge", last:"Bob");

However, I cannot figure out how to combined the named tuple with a generic type, such as Dictionary.

I have tried the below variations, but no luck:

Dictionary<string, (string, string)> name = new Dictionary<string, (string, string)>();

// this assignment yields this message:
// The tuple element name 'value' is ignored because a different name or no name is specified by the 
// target type '(string, string)'.
// The tuple element name 'limitType' is ignored because a different name or no name is specified 
// by the target type '(string, string)'.
name["cast"] = (value:"Sponge", limitType:"Bob");  

// I tried putting the name in front and at the end of the type, but no luck
// Both statements below produce syntactic error:
Dictionary<string, (value:string, string)> name;
Dictionary<string, (string:value, string)> name;

Does anyone know if C# supports the scenario above?

2 Answers

You have a two options here. First one is to declare the named tuple with custom item names at Dictionary declaration, like that

var name = new Dictionary<string, (string value, string limitType)>();
name["cast"] = ("Sponge", "Bob"); //or name["cast"] = (value: "Sponge", limitType: "Bob");

And access an items in the following way

var value = name["cast"].value;

Second one is to use an unnamed tuple with default item names (Item1, Item2, etc.)

var name = new Dictionary<string, (string, string)>();
name["cast"] = ("Sponge", "Bob");

Language support for tuples was added in C# 7, please ensure that you are using this language version, or install System.ValueTuple package, if something is missing

In this case what matters is the names in the declaration of the Dictionary:

Dictionary<string, (string First, string Last)> SomeDictionary
    = new Dictionary<string, (string, string)>();

Then you can use the names like this:

var value = SomeDictionary["SomeKey"];
var first = value.First;
var last = value.Last;
//var (first, last) = SomeDictionary["SomeKey"]; // alternative, Tuple deconstruction
Related