Есть ли конкретная причина, по которой мы должны ссылаться на свойства в кортеже как Item1, Item2 и т. Д. Мне это кажется плохой идеей, поскольку они могут легко запутаться в вашем коде. Разве не было бы более значимым иметь возможность называть свои свойства, т.е. Красный, зеленый, синий?
Почему мы не можем давать имена свойствам в кортежах?
Ответы (6)
Если вам нужны имена, не используйте кортежи.
Анонимный тип:
var t = new { Green = 1, Red = "nice" };
if (t.Green > 0) ....
Классы Tuple ‹...> - это обычные классы C #. C # не предоставляет возможности иметь свойства с динамическими именами (кроме использования словаря или динамического объекта, такого как ExpandoObject). Однако C # предоставляет что-то вроде того, что вы хотите, через анонимные типы:
var x = new { Red = 10, Blue = 20, Green = 30 }
var sum = x.Red + x.Blue + x.Green;
Причина, по которой работают анонимные типы, заключается в том, что они представляют собой просто удобный синтаксис для определения настраиваемого класса кортежа на лету.
Они имеют то преимущество, что действуют как именованные кортежи, но имеют недостаток, заключающийся в том, что программист не может именовать их (поэтому вы не можете создать метод, который явно возвращает анонимный тип).
Если вы хотите это сделать, создайте класс с соответствующими названиями свойств. Кортеж - это просто быстрый и грязный способ избежать необходимости писать класс или использовать параметры out, когда вы хотите вернуть несколько значений из метода.
Кортеж не должен содержать никаких значимых свойств. Это просто одноразовый набор предметов, собранных вместе в группу.
Если вам нужны осмысленные имена свойств, создайте тип с этими свойствами. Вы можете либо написать класс с нуля и использовать этот класс, либо использовать анонимные типы а>.
Вы можете определить такой класс (с универсальными шаблонами), если вы всегда будете неравнодушны к Red / Blue, в противном случае вы можете использовать анонимные типы, как предлагали другие.
class RedBluePair<T1, T2>
{
private T1 _Red;
private T2 _Blue;
public RedBluePair(T1 red, T2 blue)
{
_Red = red;
_Blue = blue;
}
public T1 Red { get { return _Red;} }
public T2 Blue { get { return _Blue;} }
}
Воспроизведение моего ответа из этого сообщения, поскольку теперь можно давать имена свойствам в кортежах.
Начиная с C # v7.0, теперь можно присвоить свойствам кортежа, которые раньше использовались по умолчанию, такие имена, как Item1
, Item2
и так далее.
Именование свойств кортежных литералов:
var myDetails = (MyName: "RBT_Yoga", MyAge: 22, MyFavoriteFood: "Dosa");
Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");
Вывод на консоль:
Имя - RBT_Yoga, Возраст - 22, Страсть - Доса
Возвращение кортежа (имеющего именованные свойства) из метода:
static void Main(string[] args)
{
var empInfo = GetEmpInfo();
Console.WriteLine($"Employee Details: {empInfo.firstName}, {empInfo.lastName}, {empInfo.computerName}, {empInfo.Salary}");
}
static (string firstName, string lastName, string computerName, int Salary) GetEmpInfo()
{
//This is hardcoded just for the demonstration. Ideally this data might be coming from some DB or web service call
return ("Rasik", "Bihari", "Rasik-PC", 1000);
}
Вывод на консоль:
Сведения о сотруднике: Rasik, Bihari, Rasik-PC, 1000
Создание списка кортежей с именованными свойствами
var tupleList = new List<(int Index, string Name)>
{
(1, "cow"),
(5, "chickens"),
(1, "airplane")
};
foreach (var tuple in tupleList)
Console.WriteLine($"{tuple.Index} - {tuple.Name}");
Вывод на консоль:
1 - корова 5 - куры 1 - самолет
Надеюсь, я все рассказал. В случае, если есть что-то, что я пропустил, пожалуйста, оставьте мне отзыв в комментариях.
Примечание. В моих фрагментах кода используется функция интерполяции строк C # v7, как подробно описано здесь.
var (first, second) = tupleInstance
. Как бы то ни было, работать с кортежами не намного проще, чем с анонимными классами. - person Lee   schedule 12.09.2012