Как создать список ValueTuple?

Возможно ли создать список ValueTuple в С# 7?

как это:

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

Ответ 1

Вы ищете такой синтаксис:

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;

Ответ 2

Конечно, вы можете сделать это:

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);

Ответ 3

Этот синтаксис лучше всего применять к 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"),
   };
}

Ответ 4

Просто чтобы добавить к существующим ответам, в отношении проекции 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