是否有特定原因我们必须将元组中的属性称为 Item1、Item2 等。这对我来说似乎是个坏主意,因为它们很容易在您的代码中混淆。能够命名您的属性不是更有意义吗?红、绿、蓝?
6 回答
Tuple<...> 类只是普通的 C# 类。C# 没有提供动态命名属性的方法(除了仅使用 Dictionary 或像 ExpandoObject 这样的动态对象)。但是,C# 确实通过匿名类型提供了您想要的东西:
var x = new { Red = 10, Blue = 20, Green = 30 }
var sum = x.Red + x.Blue + x.Green;
匿名类型起作用的原因是它们只是动态定义自定义元组类的便捷语法。
这些具有像命名元组一样的优点,但具有不能被程序员命名的缺点(因此您不能创建显式返回匿名类型的方法)。
如果您想要名称,请不要使用元组。
匿名类型:
var t = new { Green = 1, Red = "nice" };
if (t.Green > 0) ....
如果你想这样做,那么创建一个具有适当命名属性的类。当您想从方法返回多个值时,元组只是避免编写类或使用参数的一种快速而肮脏的方法。
元组不应该包含任何有意义的属性。它只是一组捆绑在一起的一次性物品。
如果您想要有意义的属性名称,请使用这些属性创建一个类型。您可以从头开始编写一个类并使用该类,也可以使用匿名类型。
如果您总是偏爱 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,激情 - Dosa
从方法返回元组(具有命名属性):
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 的字符串插值功能,详见此处。