Working with Tuple in C#

Jollen Moyani - Apr 3 '23 - - Dev Community

We create tons of classes to create objects for many scenarios during software development. But sometimes, we don’t need to create a new class for an object with few properties. To handle these cases, C# offers a feature named tuples.

This article will discuss tuples in C# with some practical use cases for better understanding.

What is a tuple in C#?

As developers, we have used many data structures, such as arrays_,_ queues, and linked lists, to categorize and handle data. A tuple is a simple and lightweight data structure consisting of multiple elements to represent data. It is available in C# 7.0 and higher versions.

Tuples help us access and manipulate data sets easily for different operations without having to define a new class with custom properties. First, let’s explore tuples with some examples.

Basic example for a tuple in C

Here, we’ll show how to create a tuple with a basic example in C#.

(int, string) employee1 = (23, "Yohan");
Console.WriteLine($"{employee1.Item2} is {employee1.Item1} years old");
//Yohan is 23 years old
Enter fullscreen mode Exit fullscreen mode

In this example, the requirement is to create a simple employee object to access an employee’s name and age. For this case, creating a tuple would be enough, rather than creating a class. We have created properties of type int and string in this tuple. When you haven’t provided names to the properties, you can access the properties using the syntax employee1.item1.

Tuples with fields names in C

We didn’t use field names in the previous example. But we can provide names to the properties. Refer to the following code example.

(int age, string name) employee1 = (23, "Yohan");
Console.WriteLine($"{employee1.name} is {employee1.age} years old"); 
//Yohan is 23 years old
Enter fullscreen mode Exit fullscreen mode

We used field names for the data in the employee1 tuple. Then, we could access the data using field names. The code is more readable when using the field names.

Nested tuple in C

You can also create multiple tuples inside one tuple as nested tuples. To create nested tuples, refer to the following example.

var employees = ((23, "Yohan"), (45, "Jhon Doe"), (34, "Jon Jones"));
Enter fullscreen mode Exit fullscreen mode

We have declared a nested tuple with three tuples that use int and string properties. We can now access these items one by one as needed.

To access the first nested tuple in the employee tuple, see the following code.

Console.WriteLine(employees.Item1); 
//(23, "Yohan")
Enter fullscreen mode Exit fullscreen mode

We can also access the item inside the nested tuple.

Console.WriteLine(employees.Item1.item1); 
//23
Enter fullscreen mode Exit fullscreen mode

Tuple as a function parameter in C

We can also use tuples as parameters for functions. Let’s create a function using a tuple as a parameter, as in the following code.

public void GetEmployee((string name, int age) employee)
{
    Console.WriteLine($"{employee.name} is {employee.age} years old");
}
Enter fullscreen mode Exit fullscreen mode

Then, call this function inside the Main method, as in the following code example.

public class TupleDemo
{
    public void GetEmployee((string name, int age) employee)
    {
        Console.WriteLine($"{employee.name} is {employee.age} years old");
    }
    public static void Main(string[] args)
    {
        var tupleDemo = new TupleDemo();
        tupleDemo.GetEmployee(("Yohan", 23));
    }
}
//Yohan is 23 years old

Enter fullscreen mode Exit fullscreen mode

In this code, we created the class object for TupleDemo and then called the GetEmployee function using that object. Also, we passed a tuple as the parameter for this function. In this case, we have created the tuple as the parameter for the GetEmployee method.

Tuple as the return type in C

We can use a tuple as the return type for functions. But for that, we have to use tuple for the return type, as in the following function.

public (string, int) GetEmployee()
{
    return ("Yohan", 23);
}
Enter fullscreen mode Exit fullscreen mode

In it, we created the function named GetEmployee with a tuple as the return type. Here, we have returned the tuple, which contains string and int data properties.

Refer to the following code to call the function GetEmployee and access the values of the tuple.

public class TupleDemo
{
    public static void Main(string[] args)
    {
        var tupleDemo = new TupleDemo();
        var employee = tupleDemo.GetEmployee();
        Console.WriteLine($"{employee.Item1} is {employee.Item2} years old");
    }

    public (string, int) GetEmployee()
    {
        return ("Yohan", 23);
    }
}
//Yohan is 23 years old
Enter fullscreen mode Exit fullscreen mode

Tuple deconstruction in C

Let’s look at this example.

public class TupleDemo
{
    public static void Main(string[] args)
    {
        var tupleDemo = new TupleDemo();
        var employee = tupleDemo.GetEmployee();
        Console.WriteLine($"{employee.Item1} is {employee.Item2} years old");
    }

    public (string, int) GetEmployee()
    {
        return ("Yohan", 23);
    }
}
//Yohan is 23 years old
Enter fullscreen mode Exit fullscreen mode

In this example, we created the function named GetEmployee with tuple as the return type. Then, we called that function by creating the class object and accessing the data of the tuple. We have access to the data like this employee.Item1. But, it is less readable. We can use tuple deconstruction to rescue it.

public class TupleDemo
{
    public void GetEmployee((string name, int age) employee)
    {
        Console.WriteLine($"{employee.name} is {employee.age} years old");
    }
    public static void Main(string[] args)
    {
        var tupleDemo = new TupleDemo();
        (string name, int age) = tupleDemo.GetEmployee();
        Console.WriteLine($"{name} is {age} years old");
    }

    public (string, int) GetEmployee()
    {
        return ("Yohan", 23);
    }
}
//Yohan is 23 years old
Enter fullscreen mode Exit fullscreen mode

In this example, we have used tuple deconstruction to unpackage all items in a tuple with a single-line operation.

(string name, int age) = tupleDemo.GetEmployee();
Enter fullscreen mode Exit fullscreen mode

We can increase the readability of the code by using tuple deconstruction when using tuples.

Conclusion

This article demonstrated the usage of tuples in C# programming with some useful scenarios and code examples.

The tuple is a good programming concept that will help to reduce the need to create classes and structs when we don’t need them. We can also use them to pass multiple values to the functions and use them as the return type.

I hope this article was helpful in learning about tuples in C#.

Thank you for reading!

Syncfusion’s Essential Studio is a software package that provides state-of-the-art solutions for startups and enterprises. It includes more than 1,700 components and frameworks for WinForms, WPF, .NET MAUI, ASP.NET (Web Forms, MVC, Core), UWP, WinUI, Xamarin, Flutter, Blazor, JavaScript, Angular, Vue, and React that make developers’ work easier.

Please share your feedback as comments on this blog. You can also reach us through our support forums, support portal, or feedback portal.

Related blogs

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .