Деструктурирование присваивания — свойства объекта для переменных в C#

В JavaScript есть отличная функция, с помощью которой вы можете назначить несколько переменных из свойств объекта, используя одну краткую строку. Это называется синтаксисом деструктурирующего присваивания, который был добавлен в ЭС6.

// New object
var o = {p1:'foo', p2:'bar', p3: 'baz'};
// Destructure
var {p1, p2} = o;
// Use the variables...
console.log(p1.toUpperCase()); // FOO
console.log(p2.toUpperCase()); // BAR

Я хочу сделать что-то подобное с С#.

// New anonymous object
var o = new {p1="foo", p2="bar", p3="baz"};
// Destructure (wrong syntax as of C#6)
var {p1, p2} = o;
// Use the variables...
Console.WriteLine(p1.ToUpper()); // FOO
Console.WriteLine(p2.ToUpper()); // BAR

Есть ли синтаксис для этого на С#?


person styfle    schedule 02.03.2016    source источник
comment
по какому сценарию потребовалась эта фича, просто любопытно!   -  person TechnicalSmile    schedule 24.06.2020
comment
@TechnicalSmile Для этой языковой функции (или любой языковой функции, если на то пошло) не требуется. Это все синтаксический сахар поверх нулей и единиц :) В этом случае я хочу писать меньше кода, и эта функция позволяет это сделать.   -  person styfle    schedule 20.04.2021


Ответы (2)


C# 7 Использование кортежей. Вы можете добиться чего-то вроде этого.

Вы можете создать и удалить кортеж. Фрагмент

var payLoad = (
    Username: "MHamzaRajput",
    Password: "password",
    Domain: "www.xyz.com",
    Age: "24" 
);

// Hint: You just need to follow the sequence. 

var (Username, Password, Domain, Age) = payLoad;
// or
var (username, password, _, _) = payLoad;

Console.WriteLine($"Username: {username} and Password: {password}"); 

Вывод

Username: MHamzaRajput and Password: password
person M. Hamza Rajput    schedule 08.04.2020
comment
Я получаю error CS0128: A local variable named _ is already defined in this scope. Вам нужны два разных имени для подчеркивания? - person styfle; 08.04.2020
comment
Я загрузил фрагмент ссылки, которую вы можете проверить там. - person M. Hamza Rajput; 08.04.2020

Ближайшая вещь, которая может вам помочь, - это Tuples.

C # 7, возможно, будет что-то вроде этого:

public (int sum, int count) Tally(IEnumerable<int> values) 
{
    var res = (sum: 0, count: 0); // infer tuple type from names and values
    foreach (var value in values) { res.sum += value; res.count++; }
    return res;
}


(var sum, var count) = Tally(myValues); // deconstruct result
Console.WriteLine($"Sum: {sum}, count: {count}"); 

Ссылка на обсуждение

Сейчас это невозможно.

person Szer    schedule 02.03.2016
comment
Кортежи — правильный способ сделать это сейчас, когда появился C#7. На самом деле, я бы даже сказал, что в будущем вы должны полностью заменить анонимные типы кортежами из-за более элегантного синтаксиса. Если ваш тип имеет больше свойств, чем поддерживает кортежи, вы все равно должны сделать небольшой класс. - person NH.; 02.04.2018