如何创建ValueTuple列表?

时间:2017-05-29 21:25:02

标签: c# c#-7.0 valuetuple

是否可以在C#7中创建ValueTuple列表?

像这样:

List<(int example, string descrpt)> Method()
{
    return Something;
}

4 个答案:

答案 0 :(得分:62)

您正在寻找这样的语法:

List<(int, string)> list = new List<(int, string)>();
list.Add((3, "first"));
list.Add((6, "second"));

你可以在你的情况下使用:

List<(int, string)> Method() => 
    new List<(int, string)>
    {
        (3, "first"),
        (6, "second")
    };

您还可以在返回前命名值:

List<(int Foo, string Bar)> Method() =>
    ...

您可以在(重新)命名时接收值:

List<(int MyInteger, string MyString)> result = Method();
var firstTuple = result.First();
int i = firstTuple.MyInteger;
string s = firstTuple.MyString;

答案 1 :(得分:7)

当然,你可以这样做:

List<(int example, string descrpt)> Method() => new List<int, string> { (2, "x") };

var data = Method();
Console.WriteLine(data.First().example);
Console.WriteLine(data.First().descrpt);

答案 2 :(得分:2)

关于从现有枚举中投射ValueTuples以及关于财产命名,只需添加到现有答案中即可。

您仍然可以命名元组属性,并且仍然可以通过提供元组创建中的属性名称来使用var类型推断(即,无需重复属性名称)

var list = Enumerable.Range(0, 10)
    .Select(i => (example: i, descrpt: $"{i}"))
    .ToList();

// Access each item.example and item.descrpt

类似地,当从方法返回元组的枚举时,可以在方法签名中命名属性,然后无需在方法内部再次命名它们:

public IList<(int example, string descrpt)> ReturnTuples()
{
   return Enumerable.Range(0, 10)
        .Select(i => (i, $"{i}"))
        .ToList();
}

var list = ReturnTuples();
// Again, access each item.example and item.descrpt

答案 3 :(得分:0)

此语法最适用于c# 6,但也可以在c# 7中使用。其他答案更正确,因为这里使用的是ValueTuple而不是Tuple。您可以看到ValueTuple

的差异here
List<Tuple<int, string>> Method()
{
   return new List<Tuple<int, string>>
   {
       new Tuple<int, string>(2, "abc"),
       new Tuple<int, string>(2, "abce"),
       new Tuple<int, string>(2, "abcd"),
   };
}

List<(int, string)> Method()
{
   return new List<(int, string)>
   {
       (2, "abc"),
       (2, "abce"),
       (2, "abcd"),
   };
}