为了账号安全,请及时绑定邮箱和手机立即绑定

重写 IComparer 以使用 lambda 表达式

重写 IComparer 以使用 lambda 表达式

C#
跃然一笑 2022-12-04 10:56:33
我正在尝试重写我IComparer<Animal>的代码以使用 lambda 表达式,但我似乎无法正确完成此操作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 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以使用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)


查看完整回答
反对 回复 2022-12-04
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

问题是您已将比较从 切换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);

}


查看完整回答
反对 回复 2022-12-04
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号