Sorting Collections with Custom Comparators in C#

Overview

To implement a custom compartaor in C#, you need to implement the IComparer<T> interface.

Implementation Walkthrough

  1. Define an Item model class
    /// <summary>
    /// Represents a catalog item
    /// </summary>
    public class Item
    {
        /// <summary>
        /// Item title
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// Item cost
        /// </summary>
        public double Cost { get; set; }
        /// <summary>
        /// Stock quantity
        /// </summary>
        public int Stock { get; set; }
    }

  1. Create a collection of Item instances
List<Item> catalog = new List<Item>();
catalog.Add(new Item() { Title = "itemA", Cost = 3.5, Stock = 8 });
catalog.Add(new Item() { Title = "itemB", Cost = 7.2, Stock = 2 });
catalog.Add(new Item() { Title = "itemC", Cost = 2.1, Stock = 4 });
catalog.Add(new Item() { Title = "itemD", Cost = 18.9, Stock = 0 });

  1. Implement comparator classes

(1) Cost-based comparator:

    /// <summary>
    /// Compares items based on their cost
    /// </summary>
    public class ItemCostComparer : IComparer<Item>
    {
        public int Compare(Item first, Item second)
        {
            if (first == null && second == null) return 0;
            if (first == null) return -1;
            if (second == null) return 1;
            var delta = first.Cost - second.Cost;
            if (delta > 0) return 1;
            if (delta < 0) return -1;
            return 0;
        }
    }

(2) Title-based comparator:

    /// <summary>
    /// Compares items based on their title
    /// </summary>
    public class ItemTitleComparer : IComparer<Item>
    {
        public int Compare(Item first, Item second)
        {
            if (first == null && second == null) return 0;
            if (first == null) return -1;
            if (second == null) return 1;
            return first.Title.CompareTo(second.Title);
        }
    }

(3) Stock-based cmoparator:

    /// <summary>
    /// Compares items based on their stock quantity
    /// </summary>
    public class ItemStockComparer : IComparer<Item>
    {
        public int Compare(Item first, Item second)
        {
            if (first == null && second == null) return 0;
            if (first == null) return -1;
            if (second == null) return 1;
            return first.Stock - second.Stock;
        }
    }

  1. Utility method to display results
        /// <summary>
        /// Outputs catalog contents to console
        /// </summary>
        /// <param name="catalog"></param>
        public static void DisplayCatalog(List<Item> catalog)
        {
            Console.WriteLine("Displaying catalog:");
            foreach (var entry in catalog)
            {
                Console.WriteLine($"title:{entry.Title},cost:{entry.Cost},stock:{entry.Stock}");
            }
            Console.WriteLine("End of catalog");
            Console.WriteLine("----------separator----------------------");
        }

  1. Sort the collection using different comparators and display results
    catalog.Sort(new ItemTitleComparer());
    Console.WriteLine("Sorted by title:");
    DisplayCatalog(catalog);

    catalog.Sort(new ItemStockComparer());
    Console.WriteLine("Sorted by stock:");
    DisplayCatalog(catalog);

    catalog.Sort(new ItemCostComparer());
    Console.WriteLine("Sorted by cost:");
    DisplayCatalog(catalog);

  1. Output results

Tags: C# Sorting icomparer generics collection-handling

Posted on Sun, 25 Oct 2026 16:53:25 +0000 by yandoo