Overview
To implement a custom compartaor in C#, you need to implement the IComparer<T> interface.
Implementation Walkthrough
- 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; }
}
- 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 });
- 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;
}
}
- 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----------------------");
}
- 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);
- Output results