-1

I'm trying to rewrite my IComparer<Animal> to use a lambda expression, but I can't seem to get this done correctly

public class AnimalCarriageSorter : IComparer<Animal>
{
    public int Compare(Animal animal, Animal targetAnimal)
    {
        //Compare diet first.
        if (animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) != 0) 
        {
            return animal.FoodDiet.CompareTo(targetAnimal.FoodDiet);
        }

        //Compare size.
        return targetAnimal.Size.CompareTo(animal.Size);
    }
}
Rufus L
  • 36,127
  • 5
  • 30
  • 43
im_ Ruben
  • 87
  • 2
  • 10

2 Answers2

3

You could easily rewrite it using Func<Animal, Animal, int> instead of the IComparer<Animal>, e.g.

Func<Animal, Animal, int> comparer = (x, y) => 
    x.FoodDiet.CompareTo(y.FoodDiet) != 0 ? 
        x.FoodDiet.CompareTo(y.FoodDiet) : 
        x.Size.CompareTo(y.Size)
Johnny
  • 8,939
  • 2
  • 28
  • 33
1

The problem is that you've switched the comparison from animal.CompareTo(targetAnimal) to targetAnimal.CompareTo(animal), so you will not get consistent results. You should have animal as the first object in both cases.

For example:

public int Compare(Animal animal, Animal targetAnimal)
{
    // Compare diet first.
    if (animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) != 0)
    {
        return animal.FoodDiet.CompareTo(targetAnimal.FoodDiet);
    }

    // Compare size.
    return animal.Size.CompareTo(targetAnimal.Size);
}

Or you can simplify it a little:

public int Compare(Animal animal, Animal targetAnimal)
{
    return animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) != 0 
        ? animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) 
        : animal.Size.CompareTo(targetAnimal.Size);
}
Rufus L
  • 36,127
  • 5
  • 30
  • 43