Можете ли вы объявить имена элементов в значении ValueTuple в словаре? - PullRequest
2 голосов
/ 02 марта 2020

Можно ли объявить ValueTuple как значение в Словаре, и включают имена для элементов в ValueTuple?

Я пробовал:

var x = new Dictionary<String, ValueTuple<name: String, id: String> = {...}

но я не ожидал, что это сработает, но тогда и этого не произошло:

var x = new Dictionary<String, ValueTuple<String, String>> = {
  { "mary", (name: "foo", id: "green") }}

обратите внимание, что предыдущее объявление работает без упоминания имени и идентификатора, но тогда я не могу получить доступ к члены кортежа по имени ..

var x = new Dictionary<String, ValueTuple<String, String>> = {
  { "mary", ("foo", "green") }}

var y = x["mary"].foo   // won't work

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Вы можете использовать именованные кортежи следующим образом:

var dict = new Dictionary<string, (string name, string id)>();
dict.Add("Mary", ("Foo", "green"));
...
var id = dict["Mary"].id; //get an Id value

Этот синтаксис доступен, начиная с C# 7 .

Если вы предпочитаете инициализатор коллекции , вы можете объявить словарь как

var dict = new Dictionary<string, (string name, string id)>
{
    { "Mary", ("Foo", "green") }
};

Этот var y = x["mary"].foo не будет работать, потому что foo является значением кортежа предмет, а не сам предмет. Чтобы получить foo значение, вы должны использовать dict["Mary"].name

0 голосов
/ 03 марта 2020

Да и нет.

Имена только в коде, а не в данных.

Вы можете сделать это:

var dict = new Dictionary<string, (string, string)>();
dict.Add("Mary", (name: "Foo", id: "green"));
(string foo, string bar) t1 = dict["Mary"];
var v1 = t1.foo; // Foo
var v2 = t1.bar; // green
...