Переписывает IComparer для использования лямбда-выражения - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь переписать свой IComparer<Animal>, чтобы использовать лямбда-выражение, но я не могу сделать это правильно

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);
    }
}

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Вы можете легко переписать его, используя Func<Animal, Animal, int> вместо IComparer<Animal>, например

Func<Animal, Animal, int> comparer = (x, y) => 
    x.FoodDiet.CompareTo(y.FoodDiet) != 0 ? 
        x.FoodDiet.CompareTo(y.FoodDiet) : 
        x.Size.CompareTo(y.Size)
1 голос
/ 09 апреля 2019

Проблема в том, что вы переключили сравнение с animal.CompareTo(targetAnimal) на targetAnimal.CompareTo(animal), поэтому вы не получите последовательных результатов.Вы должны иметь 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 animal.Size.CompareTo(targetAnimal.Size);
}

Или вы можете немного упростить его:

public int Compare(Animal animal, Animal targetAnimal)
{
    return animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) != 0 
        ? animal.FoodDiet.CompareTo(targetAnimal.FoodDiet) 
        : animal.Size.CompareTo(targetAnimal.Size);
}
...