web-dev-qa-db-fra.com

Comment créer une liste de ValueTuple?

Est-il possible de créer une liste de ValueTuple en C # 7?

comme ça:

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

Vous recherchez une syntaxe comme celle-ci:

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

Vous pouvez utiliser comme ça dans votre cas:

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

Vous pouvez également nommer les valeurs avant de renvoyer:

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

Et vous pouvez recevoir les valeurs en les (re) nommant:

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

Bien sûr, vous pouvez le faire:

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

Juste pour ajouter aux réponses existantes, en ce qui concerne la projection de ValueTuples à partir d'énumérables existants et en ce qui concerne la dénomination des propriétés:

Vous pouvez toujours nommer les propriétés du tuple ET continuer à utiliser l'inférence de type var (c'est-à-dire sans répéter les noms de propriété) en fournissant les noms des propriétés dans la création du tuple, c'est-à-dire.

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

// Access each item.example and item.descrpt

De même, lorsque vous retournez des énumérables de nuplets à partir d'une méthode, vous pouvez nommer les propriétés dans la signature de la méthode. Vous n'avez PAS besoin de les nommer à nouveau dans la méthode:

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

Cette syntaxe s’applique mieux à c# 6 mais peut être utilisé dans c# 7 ainsi que. D'autres réponses sont beaucoup plus correctes car elles tendent à utiliser ValueTuple au lieu de Tuple utilisé ici. Vous pouvez voir les différences ici pour 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