Often, we want to return more than one value from a class method. Prior to the introduction of tuples in .NET, there were three common ways to do so.
- Out parameters
- Class or struct types
- Anonymous types returned through a dynamic return type
Tuples solve this problem. Tuples aren’t new to C# or .NET. Tuples were first introduced as a part of .NET Framework 4.0.
A tuple is a data structure that provides an easy way to represent a single set of data. The System.Tuple class provides static methods to create tuple objects.
Tuples allow us to,
- Create, access, and manipulate a data set
- Return a data set from a method without using out parameter
- Pass multiple values to a method through a single parameter
Create and Access Tuples
We can create a Tuple<> using its constructor or the "Create" method. The code snippet in Listing 1 creates a 3-tuple using a constructor. The tuple is a set of 3 data types including two strings and one int that represents an author's name, book title, and year of publication.
-
- var author = new Tuple<string, string, int>("Mahesh Chand", "ADO.NET Programming", 2003);
-
-
- System.Console.WriteLine("Author {0} wrote his first book titled {1} in {2}.", author.Item1, author.Item2, author.Item3);
Listing 1.
The code snippet in Listing 2 creates a 5-tuple using the static "Create" method. The tuple is a set of 5 data types including three strings, one int, and one double data type.
-
- var pubAuthor = Tuple.Create("Mahesh Chand", "Graphics Programming with GDI+", "Addison Wesley", 2004, 49.95);
-
- System.Console.WriteLine("Author {0} wrote his fourth book titled {1} for {2} in {3}. Price: {4}", pubAuthor.Item1, pubAuthor.Item2, pubAuthor.Item3, pubAuthor.Item4, pubAuthor.Item5);
Listing 2.
Nested Tuples
.NET framework supports tuples with up to seven elements. To have a tuple with more than seven elements, you can use the 8th element, TRest, to created nesting tuple objects. The code snippet in Listing 3 creates a tuple with a nested tuple inside it.
- var even8 = new Tuple<int, int, int, int, int, int, int, Tuple<double, double, double>> (2, 4, 6, 8, 10, 12, 14, Tuple.Create(1.1,1.2,1.3));
- Console.WriteLine("{0},{1},{2}", even8.Rest.Item1, even8.Rest.Item2, even8.Rest.Item3);
Listing 3.
Tuples in methods
A tuple is useful when you need to pass a data set as a single parameter of a method without using ref and out parameters. The code snippet in Listing 4 passes a tuple as a parameter of the method.
- public void SetTupleMethod(Tuple<string, string, int> tupleAuthor)
- {
- var author2 = tupleAuthor;
- Console.WriteLine("Author:{0}, Title:{1}, Year:{2}.",
- author2.Item1, author2.Item2, author2.Item3);
- }
Listing 4.
The following code snippet in Listing 5 calls the method.
- ts.SetTupleMethod(new Tuple<string, string, int>(
- "Mike Gold", "Code UML", 2005));
Listing 5.
Return Tuples
A tuple can be used to return a data set as a single variable of a method. The code snippet in Listing 6 returns a tuple with 3 values.
- public static Tuple<string, string, int> GetTupleMethod()
- {
-
- var author = new Tuple<string, string, int>(
- "Mahesh Chand", "Programming C#", 2002);
- return author;
- }
Listing 6.
The code snippet in Listing 7 calls the method, gets a tuple, and reads its values.
- var author2 = TupleSamples.GetTupleMethod();
- Console.WriteLine("Author:{0}, Title:{1}, Year:{2}.", author2.Item1, author2.Item2, author2.Item3);
Listing 7.
C# 7.0 and Tuples
Note
C# 7.0 features may not be available as a part of Visual Studio 2017 RC or other previous versions. To add the Tuples feature, you may want to download and install the NuGet package.
Step 1
Right click on the project name in Solution Explorer and select “Manage NuGet Package”.
Step 2
Click on the "Browse" tab and type System.ValueTuple in the TextBox. You will see the package name, as shown below.
Step 3
Select “TuplesSample” and click on the "Install" button.
Follow the instructions.
You’re now ready to use C# 7.0 tuples.
C# 7.0 extends the tuples' functionality by adding tuple types and tuple literals.
We can replace the above tuples code sample with the code listed in Listing 8, where the TupleReturnLiteral method returns a tuple type of three values.
-
- public (string, string, long) TupleReturnLiteral(long id)
- {
-
- string name = string.Empty;
- string title = string.Empty;
- long year = 0;
-
- if (id == 1000)
- {
- name = "Mahesh Chand";
- title = "ADO.NET Programming";
- year = 2003;
- }
-
-
- return (name, title, year);
-
- }
Listing 8.
The code listed in Listing 9 calls the above TupleReturnLiternal method and returns a tuple variable. The code reads the tuple values using Item1, Item2, and Item3 of tuple and displays the values on the console.
- TupleSamples ts = new TupleSamples();
- var author = ts.TupleReturnLiteral(1000);
- Console.WriteLine($"Author {author.Item1} {author.Item2} {author.Item3} ");
Listing 9.
To make the above code more readable, we can name the tuple return type values. The code snippet in Listing 10 changes the method signature by giving the tuple type values names.
-
- public (string name, string title, long year) TupleReturnLiteral(long id)
- {
-
- string name = string.Empty;
- string title = string.Empty;
- long year = 0;
-
- if (id == 1000)
- {
-
- name = "Mahesh Chand";
- title = "ADO.NET Programming";
- year = 2003;
- }
-
-
- return (name, title, year);
-
- }
Listing 10.
The code snippet in Listing 11 calls the method listed in Listing 10. As you can see from Listing 11, the tuple values can be accessed using the tuple variable names.
- TupleSamples ts = new TupleSamples();
- var author = ts.TupleReturnLiteral(1000);
- Console.WriteLine($"Author {author.name} {author.title} {author.year} ");
Listing 11.
Summary
In this article, we learned about tuples in C# and how to apply the new changes introduced in C# 7.0.
References
References used to write this article,
https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/