Можно ли использовать именованный кортеж с объявлением типа generi c? - PullRequest
3 голосов
/ 08 марта 2020

Я знаю, что мы можем объявить именованные кортежи, например:

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

Однако Я не могу понять, как объединить именованный кортеж с универсальным типом c, таким как Словарь .

Я испробовал следующие варианты, но не повезло:

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;

Кто-нибудь знает, поддерживает ли C# сценарий выше?

Ответы [ 2 ]

4 голосов
/ 08 марта 2020

У вас есть два варианта здесь. Сначала нужно объявить именованный кортеж с именами пользовательских элементов в объявлении Dictionary, например

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

, и получить доступ к элементам следующим образом

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

Второй - использовать неназванный кортеж с именами элементов по умолчанию (Item1, Item2, et c.)

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

Добавлена ​​поддержка языка для кортежей в C# 7 убедитесь, что вы используете эту языковую версию или установите пакет System.ValueTuple , если что-то отсутствует

1 голос
/ 08 марта 2020

В этом случае важны имена в объявлении Dictionary:

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

Тогда вы можете использовать имена, подобные этому:

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