Search code examples
c#.neticomparable

How do I use the IComparable interface?


I need a basic example of how to use the IComparable interface so that I can sort in ascending or descending order and by different fields of the object type I'm sorting.


Solution

  • Well, since you are using List<T> it would be a lot simpler to just use a Comparison<T>, for example:

    List<Foo> data = ...
    // sort by name descending
    data.Sort((x,y) => -x.Name.CompareTo(y.Name));
    

    Of course, with LINQ you could just use:

    var ordered = data.OrderByDescending(x=>x.Name);
    

    But you can re-introduce this in List<T> (for in-place re-ordering) quite easily; Here's an example that allows Sort on List<T> with lambda syntax:

    using System;
    using System.Collections.Generic;  
    
    class Foo { // formatted for vertical space
        public string Bar{get;set;}
    }
    static class Program {
        static void Main() {
            List<Foo> data = new List<Foo> {
                new Foo {Bar = "abc"}, new Foo {Bar = "jkl"},
                new Foo {Bar = "def"}, new Foo {Bar = "ghi"}
            };
            data.SortDescending(x => x.Bar);
            foreach (var row in data) {
                Console.WriteLine(row.Bar);
            }
        }
    
        static void Sort<TSource, TValue>(this List<TSource> source,
                Func<TSource, TValue> selector) {
            var comparer = Comparer<TValue>.Default;
            source.Sort((x,y)=>comparer.Compare(selector(x),selector(y)));
        }
        static void SortDescending<TSource, TValue>(this List<TSource> source,
                Func<TSource, TValue> selector) {
            var comparer = Comparer<TValue>.Default;
            source.Sort((x,y)=>comparer.Compare(selector(y),selector(x)));
        }
    }