Collection Expressions in C#

Collection Expressions in C# with Examples

In this article, I will discuss Collection Expressions in C# with Examples. Please read our previous article discussing Primary Constructors for All Types in C# with Examples. C# 12 introduces Collection Expressions, a powerful feature that simplifies the initialization of collections such as arrays, lists, and spans. This feature allows a more concise and readable syntax for initializing collections, reducing the need for different initialization patterns.

What’s New in C# 12?

Before C# 12, initializing collections like arrays, lists, and spans required different syntax for each type, which could sometimes lead to inconsistency or confusion. With C# 12, Collection Expressions aim to provide a standard, readable, concise definition of collections.

What are Collection Expressions in C# 12?

Collection Expressions are a new feature introduced in C# 12 that simplifies the initialization of collections, such as arrays, lists, spans, and other types supporting collection initializers. This feature introduces a unified syntax for defining collections and easily supports the spread operator (..) to include elements from different collections.

Array Initialization:

You can initialize arrays using square brackets ([ ]), similar to how you would initialize lists and spans. Example: int[] numbers = [1, 2, 3, 4, 5];

List Initialization:

A list can now be initialized using the same syntax with square brackets. Example: List<int> list = [10, 20, 30, 40];

Span Initialization:

Spans are a type that represents contiguous regions of memory, and they can also be initialized with the same collection expression syntax. Example: Span<int> span = [5, 10, 15];

Combining Collections Using the Spread Operator (..):

The spread operator (..) allows you to combine elements from multiple collections into one.

int[] array1 = [1, 2, 3];
int[] array2 = [4, 5, 6];
int[] combined = [..array1, ..array2];

Example: Basic Use of Collection Expressions in C#

Let’s take a look at a basic example of how Collection Expressions can be used in C# 12.

namespace CSharp12NewFeatures
{
    public class Program
    {
        static void Main()
        {
            // Using collection expressions for array initialization
            int[] numbers = [1, 2, 3, 4, 5];
            Console.WriteLine("Array: " + string.Join(", ", numbers));

            // Using collection expressions for List initialization
            List<string> colors = ["Red", "Green", "Blue"];
            Console.WriteLine("List: " + string.Join(", ", colors));

            // Using collection expressions for Span initialization
            Span<double> measurements = [1.5, 2.3, 3.7];
            // string.Join() does not support Span<T> directly.
            // To use string.Join() with a Span<double>, we must first convert it to an array.
            Console.WriteLine("Span: " + string.Join(", ", measurements.ToArray()));

            // Combining multiple collections using the spread operator
            int[] array1 = [1, 2, 3];
            int[] array2 = [4, 5, 6];
            int[] combinedArray = [.. array1, .. array2];
            Console.WriteLine("Combined Array: " + string.Join(", ", combinedArray));
        }
    }
}
Code Explanation:
  • Array Initialization: The array numbers are initialized using the collection expression syntax [1, 2, 3, 4, 5], which is simpler and cleaner compared to the traditional new int[] { 1, 2, 3, 4, 5 }.
  • List Initialization: The colors list is initialized in a similar manner with [“Red”, “Green”, “Blue”], replacing the need for new List<string> { “Red”, “Green”, “Blue” }.
  • Span Initialization: The measurements span is initialized using the collection expression syntax [1.5, 2.3, 3.7].
  • Combining Collections: The spread operator (..) is used to combine array1 and array2 into a new array combinedArray. The values from both arrays are combined into a single array.
Output:

Basic Use of Collection Expressions in C#

Real-Time Use Case: Merging Multiple Data Sets using Collection Expressions in C#

Consider a scenario where you are dealing with an inventory management system in an e-commerce application and have multiple product data sources (e.g., WarehouseA and WarehouseB). You can use collection expressions to merge the product data from various sources efficiently.

namespace InventoryManagement
{
    public class Program
    {
        static void Main()
        {
            // Simulate product data from two warehouses
            List<string> warehouseA = ["Laptop", "Smartphone", "Tablet"];
            List<string> warehouseB = ["Headphones", "Monitor", "Mouse"];

            // Merging the product data from both warehouses using collection expressions
            List<string> allProducts = [.. warehouseA, .. warehouseB];

            // Displaying the combined product data
            Console.WriteLine("All Products: " + string.Join(", ", allProducts));
        }
    }
}
Code Explanation:
  • The spread operator (..) is used to combine product data from warehouseA and warehouseB.
  • The allProducts list combines both inventories into one list, which can then be processed or displayed.
Benefits of Collection Expressions:
  • This simplifies the process of combining collections, especially when you need to merge multiple data sets.
  • It reduces the need for looping through each collection and manually adding items.
  • Collection expressions make the code cleaner and more readable.
Real-World Use Cases for Collection Expressions
  • E-Commerce Inventory Merging: As shown in the example, collection expressions make the code much more concise and easier to maintain when merging product lists from multiple warehouses.
  • Customer Data Aggregation: When aggregating customer data from multiple regions or databases, collection expressions can easily merge different data sources without complex logic.
  • Combining Different Data Streams: In real-time data processing systems, where data from multiple sources needs to be combined (e.g., sensor data, web logs, etc.), collection expressions can simplify the merging of data into a unified stream for further processing.
  • Flexible Collection Initialization: Whether you are working with arrays, lists, or spans, collection expressions allow for a unified approach to initializing these collections, reducing the need for different initialization patterns.
Real-Time Scenario: Task Management System

In this scenario, we have multiple team members working on different tasks for a project. Each team member has a list of assigned tasks, and we need to combine them into one unified list for project tracking. We will use Collection Expressions in C# 12 to simplify this process

using System;
using System.Collections.Generic;

namespace TaskManagementApp
{
    // Task class to represent individual tasks
    public class Task
    {
        public string Title { get; }
        public string Assignee { get; }
        public DateTime DueDate { get; }

        public Task(string title, string assignee, DateTime dueDate)
        {
            Title = title;
            Assignee = assignee;
            DueDate = dueDate;
        }

        public override string ToString()
        {
            return $"Task: {Title}, Assigned to: {Assignee}, Due: {DueDate.ToShortDateString()}";
        }
    }

    public class Program
    {
        static void Main()
        {
            // Simulate tasks from different team members
            List<Task> teamMember1Tasks = new List<Task>
            {
                new Task("Design Database Schema", "Alice", DateTime.Now.AddDays(3)),
                new Task("Create API Endpoints", "Alice", DateTime.Now.AddDays(5))
            };

            List<Task> teamMember2Tasks = new List<Task>
            {
                new Task("Implement Authentication", "Bob", DateTime.Now.AddDays(4)),
                new Task("Write Unit Tests", "Bob", DateTime.Now.AddDays(6))
            };

            List<Task> teamMember3Tasks = new List<Task>
            {
                new Task("Write Documentation", "Charlie", DateTime.Now.AddDays(2)),
                new Task("Review Pull Requests", "Charlie", DateTime.Now.AddDays(7))
            };

            // Using collection expressions to combine tasks from different team members
            List<Task> allTasks = [.. teamMember1Tasks, .. teamMember2Tasks, .. teamMember3Tasks];

            // Display the combined list of tasks
            Console.WriteLine("All Tasks for the Project:");
            foreach (var task in allTasks)
            {
                Console.WriteLine(task);
            }
        }
    }
}
Code Explanation:
  • Task Class: The Task class represents individual tasks that a team member is assigned. Each Task has a Title, Assignee, and DueDate.
  • Simulating Tasks for Team Members: We simulate tasks for three team members: Alice, Bob, and Charlie. Each team member has their own list of tasks (teamMember1Tasks, teamMember2Tasks, and teamMember3Tasks).
  • Using Collection Expressions: The spread operator (..) is used to combine the task lists from all three team members into a single list: allTasks. The syntax [..teamMember1Tasks, ..teamMember2Tasks, ..teamMember3Tasks] makes it easy to merge the collections into one without needing to manually loop through and add elements from each list.
  • Displaying the Combined Tasks: After combining the tasks, we print the complete list of tasks for the project.
Output:

Collection Expressions in C# with Examples

C# 12’s Collection Expressions feature significantly enhances the way we work with collections. By offering a unified syntax for initializing arrays, lists, spans, and more, along with the powerful spread operator (..), it makes the code simpler, more readable, and less error-prone. This feature not only improves code clarity but also boosts productivity by reducing repetitive code and providing a more natural way of combining collections.

In the next article, I will discuss the InlineArray Attribute in C# with Examples. In this article, I explain Collection Expressions in C# with Examples. I want your feedback. Please post your feedback, questions, or comments about this article.

Leave a Reply

Your email address will not be published. Required fields are marked *