C# 如何创建ValueTuple列表?

C# 如何创建ValueTuple列表?,c#,c#-7.0,valuetuple,C#,C# 7.0,Valuetuple,是否可以在C#7中创建ValueTuple列表 像这样: List<(int example, string descrpt)> Method() { return Something; } List<(int, string)> list = new List<(int, string)>(); list.Add((3, "first")); list.Add((6, "second")); List方法() { 归还某物; } 此语法最适用于c

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

像这样:

List<(int example, string descrpt)> Method()
{
    return Something;
}
List<(int, string)> list = new List<(int, string)>();
list.Add((3, "first"));
list.Add((6, "second"));
List方法()
{
归还某物;
}

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

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"),
   };
}
List方法()
{
返回新列表
{
新元组(2,“abc”),
新元组(2,“abce”),
新元组(2,“abcd”),
};
}
列表方法()
{
返回新列表
{
(2,“abc”),
(2,“abce”),
(2,“abcd”),
};
}
当然,您可以这样做:

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);
List-Method()=>新列表{(2,x”)};
var数据=方法();
Console.WriteLine(data.First().example);
Console.WriteLine(data.First().descrpt);

您正在寻找这样的语法:

List<(int example, string descrpt)> Method()
{
    return Something;
}
List<(int, string)> list = new List<(int, string)>();
list.Add((3, "first"));
list.Add((6, "second"));
List List=新列表();
添加((3,“第一”);
增加((6,“第二”);
在您的案例中,您可以这样使用:

List<(int, string)> Method() => 
    new List<(int, string)>
    {
        (3, "first"),
        (6, "second")
    };
List方法()=>
新名单
{
(3,“第一”),
(6,“第二”)
};
还可以在返回之前命名这些值:

List<(int Foo, string Bar)> Method() =>
    ...
List方法()=>
...
您可以在(重新)命名时接收这些值:

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

仅添加到现有答案中,关于从现有枚举中投影
值元组
,以及关于属性命名:

通过在元组创建中提供属性的名称,您仍然可以命名元组属性并使用
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
public IList ReturnTuples()
{
返回可枚举范围(0,10)
.Select(i=>(i,$“{i}”))
.ToList();
}
var list=ReturnTuples();
//再次访问每个item.example和item.descrpt

为什么不试试呢?我几乎想投否决票,因为这是返回命名元组列表所需的语法。为什么会有这个问题?我想问题不是关于方法的返回类型,而是关于缺少的东西。相关帖子-根本不需要使用“Tuple”,我当然更喜欢这个sintax,它比其他的更可读、更清晰。这是C#6及以下版本的正确语法。由于此答案使用的是
Tuple
,而不是
ValueTuple
,因此被否决。就内存使用和性能而言,Tuple和ValueTuple之间存在显著差异。当人们问起C#7和元组时,他们不是指旧元组。元组是在堆上创建的,需要进行垃圾收集。在堆栈上创建ValueTuple。最好在方法定义中命名字段。