根据是否将值分配给2个属性之一

问题描述

在C#中,是否可以通过以某种方式概括属性来简化此过程?真的很好奇。

Image Crop = new Image("test.jpg");
int Margin = 2;
int Dif = Math.Abs(Crop.Width - Crop.Height);
if (Crop.Width < Crop.Height) {
    Crop.X -= Dif / 2;                //
    Crop.Width += Dif;                // A
    Dif = Crop.Height * Margin * 2;   //
} else {
    Crop.Y -= Dif / 2;                //
    Crop.Height += Dif;               // B
    Dif = Crop.Width * Margin * 2;    // 
}

感觉A和B可以由确定是否选择“作物”的“ X和宽度”或“作物的Y和高度”的函数代替。上面的代码可以正常工作,但是我认为必须有一种更漂亮的方法,但我找不到它。

尽管在Java中,我的一个朋友还是使用IntConsumer和lambda函数将A&B简化为一个神奇地起作用的函数。我不明白。 :-)

private static int squarize(int n,int shortBound,int longBound,IntConsumer locSetter,IntConsumer boundSetter,int dif,int margin) {
    locSetter.accept(n - dif / 2);
    boundSetter.accept(shortBound + dif);
    return longBound * margin * 2;
}

解决方法

要回答您的问题:“在C#中,是否可以通过以某种方式概括属性来简化此过程?”

不,不是。您的代码就可以了。

为完整起见,您可以这样做,但是要明确一点:我认为这比原始代码更容易遵循。只是“聪明”。

if (Crop.Width < Crop.Height)
    (Crop.X,Crop.Width,Dif) = (Crop.X - Dif / 2,Crop.Width  + Dif,Crop.Height * Margin * 2);
else
    (Crop.Y,Crop.Height,Dif) = (Crop.Y - Dif / 2,Crop.Height + Dif,Crop.Width  * Margin * 2);

美容在情人眼中,因此,如果这是“漂亮”,则取决于您。 ;)

我更喜欢原始照片。