如何命名元组属性?

Ale*_*ksP 11 c# tuples

如何和"可能"组织从返回元组类型的方法返回与参数的名称,作为一个exapmle

private static Tuple<string, string> methodTuple()
{
    return new {Name = "Nick", Age = "Twenty"}; /*exception because need to new Tuple<string, string>(){Item1 = "Nick", Item2 = "Twenty"}o*/
}
Run Code Online (Sandbox Code Playgroud)

和调用参数 methodTuple.Name不喜欢methodTuple.Item1....N

这可能吗?

UPD:我想用没有新命名类型的命名参数创建对象.

Mar*_*zek 13

您需要声明一个帮助程序类来执行此操作.

public class MyResult
{
    public string Nick { get; set; }
    public string Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你想要返回的是匿名类型.顾名思义你不知道它的名字是什么,所以你不能声明你的方法来返回它.

匿名类型(C#编程指南)

您不能将方法的字段,属性,事件或返回类型声明为具有匿名类型.同样,您不能将方法,属性,构造函数或索引器的形式参数声明为具有匿名类型.要传递匿名类型或包含匿名类型的集合作为方法的参数,可以将参数声明为类型对象.但是,这样做会破坏强类型的目的.如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型.

更新

C#7引入了语言内置的Tuple支持,它带有命名元组

(string name, int age) methodTuple()
{
    (...)
}
Run Code Online (Sandbox Code Playgroud)

有关docs.microsoft.com的更多信息,请访问:https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#tuples

  • 我认为通过将更新移动到答案的顶部可以改进这个答案。 (3认同)
  • 请注意,这里定义的类型是可变的,而不是不可变的,并且没有覆盖其值语义的等价语义,这与`Tuple`或匿名类型不同. (2认同)

Mic*_*cko 10

在C#7.0(Visual Studio 2017)中有一个新选项:

(string first, string middle, string last) LookupName(long id)
Run Code Online (Sandbox Code Playgroud)

  • 我认为将它们视为公共领域(或财产),应该以适当的方式 (2认同)
  • 此选项适用于 ValueTuples,不适用于元组! (2认同)

Ser*_*rvy 6

这是不可能的Tuple,不.您需要创建自己的新命名类型才能执行此操作.

  • 现在可能在C#7.0中 (5认同)
  • @Flater,当您只需要将几个属性组合在一起时,或者从方法中获取简单的返回类型(在该方法中,即使创建简单的类型似乎也是一件苦差事)时,它们就非常有用。如果是一次性的类型只能使用一次,那么它特别有用。它有点像具有命名属性的匿名类型:-) 如果您可以声明元组的别名以在多个位置使用,则会更有用。 (2认同)

RBT*_*RBT 5

启动C#7.0版现在可以命名较早使用默认名称类似的元组的属性Item1Item2等等。

命名元组文字的属性

var myDetails = (MyName: "RBT_Yoga", MyAge: 22, MyFavoriteFood: "Dosa");
Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");
Run Code Online (Sandbox Code Playgroud)

控制台上的输出:

名字-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);
}
Run Code Online (Sandbox Code Playgroud)

控制台上的输出:

员工详细信息: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}");
Run Code Online (Sandbox Code Playgroud)

在控制台上输出:

1-牛5-鸡1-飞机

我希望我已经涵盖了所有内容。如果有任何我想念的东西,请在评论中给我反馈。

注意:我的代码段使用的是C#v6的字符串插值功能,如此处所述

  • 安装包 System.ValueTuple (2认同)