Comprehensive Guide to Sorting List<T> by Object Properties in C#

Oct 20, 2025 · Programming · 34 views · 7.8

Keywords: C# | List Sorting | LINQ | Object Properties | Sorting Algorithms

Abstract: This article provides an in-depth exploration of various methods for sorting List<T> collections by object properties in C#, with emphasis on LINQ OrderBy extension methods and List.Sort approaches. Through detailed code examples and performance analysis, it compares differences between creating new sorted collections and in-place sorting, while addressing advanced scenarios like null value handling and multi-property sorting. The coverage includes related sorting algorithm principles and best practice recommendations, offering developers comprehensive sorting solutions.

Introduction

In C# programming, sorting object collections is a common and crucial task. List<T>, as one of the most frequently used collection types, provides multiple sorting approaches. This article systematically introduces various methods for sorting List<T> based on object properties, demonstrating application scenarios and performance characteristics through practical examples.

Basic Sorting Methods

Consider a typical business scenario: we have an Order class containing properties like OrderId, OrderDate, Quantity, and Total. Now we need to sort a list of Order objects by specific properties.

public class Order
{
    public int OrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public int Quantity { get; set; }
    public decimal Total { get; set; }
}

List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // Populate order list

Using LINQ OrderBy Method

LINQ (Language Integrated Query) provides the most concise sorting approach. The OrderBy method creates a new sorted sequence without modifying the original collection.

// Sort by OrderDate property in ascending order
List<Order> sortedList = objListOrder.OrderBy(o => o.OrderDate).ToList();

// Sort by OrderId property in descending order
List<Order> descendingList = objListOrder.OrderByDescending(o => o.OrderId).ToList();

The advantage of this method lies in its concise and readable code while maintaining the integrity of original data. It's suitable for scenarios where preserving the original data order is important.

Using List.Sort Method for In-Place Sorting

If you need to modify the original collection rather than creating a new one, you can use the List<T>'s Sort method with a Comparison delegate.

// In-place sorting by OrderDate
objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

// In-place sorting by OrderId in descending order
objListOrder.Sort((x, y) => y.OrderId.CompareTo(x.OrderId));

This method directly modifies the original collection, offering higher memory efficiency but losing the original order.

Advanced Sorting Techniques

Multi-Property Sorting

In practical applications, sorting by multiple properties is frequently required. LINQ provides the ThenBy method to fulfill this requirement.

// Sort by OrderDate ascending, then by OrderId ascending
List<Order> multiSorted = objListOrder
    .OrderBy(o => o.OrderDate)
    .ThenBy(o => o.OrderId)
    .ToList();

// Sort by Total descending, then by Quantity ascending
List<Order> complexSorted = objListOrder
    .OrderByDescending(o => o.Total)
    .ThenBy(o => o.Quantity)
    .ToList();

Handling Null Values

When sorting properties that might contain null values, special handling is required to avoid runtime exceptions.

// Safely handle potentially null string properties
List<Order> safeSorted = objListOrder
    .OrderBy(o => o.CustomerName ?? string.Empty)
    .ToList();

// Using null conditional operator with default values
List<Order> nullSafeSorted = objListOrder
    .OrderBy(o => o.OrderDate ?? DateTime.MinValue)
    .ToList();

Performance Analysis and Best Practices

Performance Comparison

The OrderBy method is based on deferred execution and streaming processing, suitable for large datasets but creates new collections. The List.Sort method operates in-place with higher memory efficiency but modifies original data.

// Performance testing example
var stopwatch = Stopwatch.StartNew();

// LINQ approach
var linqResult = largeList.OrderBy(x => x.Property).ToList();
stopwatch.Stop();
Console.WriteLine($"LINQ sorting time: {stopwatch.ElapsedMilliseconds}ms");

stopwatch.Restart();
// Sort method approach
largeList.Sort((x, y) => x.Property.CompareTo(y.Property));
stopwatch.Stop();
Console.WriteLine($"Sort method time: {stopwatch.ElapsedMilliseconds}ms");

Best Practice Recommendations

1. Prefer LINQ OrderBy method for read-only operations

2. Use List.Sort method when modifying the original collection is required

3. Consider performance implications when handling large datasets

4. Always handle potential null value scenarios

5. When using ThenBy for multi-level sorting, arrange by business importance order

Practical Application Scenarios

Sorting in Paginated Queries

In web applications, implementing sorting functionality in paginated queries is common.

public List<Order> GetSortedOrders(int page, int pageSize, string sortBy, bool ascending)
{
    IQueryable<Order> query = dbContext.Orders;
    
    switch (sortBy.ToLower())
    {
        case "orderdate":
            query = ascending ? query.OrderBy(o => o.OrderDate) : query.OrderByDescending(o => o.OrderDate);
            break;
        case "total":
            query = ascending ? query.OrderBy(o => o.Total) : query.OrderByDescending(o => o.Total);
            break;
        default:
            query = query.OrderBy(o => o.OrderId);
            break;
    }
    
    return query.Skip((page - 1) * pageSize).Take(pageSize).ToList();
}

Custom Comparers

For complex sorting logic, custom comparers can be implemented.

public class OrderDateComparer : IComparer<Order>
{
    public int Compare(Order x, Order y)
    {
        if (x == null && y == null) return 0;
        if (x == null) return -1;
        if (y == null) return 1;
        
        return x.OrderDate.CompareTo(y.OrderDate);
    }
}

// Using custom comparer
objListOrder.Sort(new OrderDateComparer());

Conclusion

C# provides multiple flexible approaches for sorting List<T> collections by object properties. The LINQ OrderBy method, with its concise syntax and functional programming style, has become the most commonly used choice, while the List.Sort method offers better performance when in-place sorting is required. Developers should choose appropriate sorting strategies based on specific requirements and pay attention to edge cases like null values and multi-property sorting. By mastering these sorting techniques, developers can write more efficient and maintainable C# code.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.