为什么我们不能给元组中的属性命名?

时间:2012-09-12 11:43:56

标签: c# tuples

是否有一个特定的原因,我们必须将元组中的属性称为Item1,Item2等。这对我来说似乎是一个坏主意,因为它们很容易混淆在你的代码中。能够为您的房产命名是不是更有意义,即。红色,绿色,蓝色?

6 个答案:

答案 0 :(得分:5)

如果您想要名字,请不要使用元组。

匿名类型:

var t = new { Green = 1, Red  = "nice" };

if (t.Green > 0) ....

答案 1 :(得分:5)

元组< ...>类只是普通的C#类。 C#没有提供动态命名属性的方法(除了使用Dictionary或像ExpandoObject这样的动态对象)。但是,C#确实通过匿名类型提供了你想要的东西:

var x = new { Red = 10, Blue = 20, Green = 30 }
var sum = x.Red + x.Blue + x.Green;

匿名类型工作的原因是它们只是一种方便的语法,用于动态定义自定义元组类。

这些具有像命名元组一样的优点,但缺点是程序员不能命名(因此你不能创建一个显式返回匿名类型的方法)。

答案 2 :(得分:2)

如果要执行此操作,请创建具有适当命名属性的类。当你想从方法中返回多个值时,元组只是一种快速而又脏的方法,可以避免编写类或使用参数。

答案 3 :(得分:1)

元组不应包含任何有意义的属性。它只是一组一次性聚集在一起的物品。

如果您需要有意义的属性名称,请使用这些属性创建一个类型。您可以从头开始编写类并使用该类,也可以使用anonymous types

答案 4 :(得分:1)

如果你总是偏向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;} }
    }

答案 5 :(得分:0)

this帖子中重现我的回答,因为现在可以为元组中的属性命名。

现在可以启动C#v7.0,可以将之前用来默认为Item1Item2等名称的元组属性命名为。

命名Tuple Literals的属性

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的字符串插值功能,详细内容为here