web-dev-qa-db-ja.com

ValueTupleのリストを作成する方法は?

C#7でValueTupleのリストを作成することは可能ですか?

このような:

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

次のような構文を探しています:

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;
69
Guilherme

確かに、あなたはこれを行うことができます:

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

既存の列挙型からのValueTuplesの投影とプロパティの命名に関して、既存の回答に追加するだけです。

Tuple作成でプロパティの名前を指定することで、引き続きタプルプロパティに名前を付け、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
2
StuartLC

この構文はc# 6に最適に適用されますが、c# 7でも使用できます。ここで使用されているValueTupleの代わりにTupleを使用する傾向があるため、他の回答ははるかに正確です。違いを見ることができます here for 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"),
   };
}
0
Rajmond Burgaj