【问题标题】:Assign a value to one of 2 properties depending on the if根据 if 为 2 个属性之一赋值
【发布时间】:2020-09-25 14:45:59
【问题描述】:

是否有可能在 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# dry simplify


【解决方案1】:

回答您的问题:“是否有可能在 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);

美丽在旁观者的眼中,因此是否“更漂亮”取决于您。 ;)

我更喜欢原版。

【讨论】:

  • 三元组的酷用! :-D 我明白你所说的聪明。谢谢。
  • @JefBracke 此答案中没有使用三元运算符。这只是使用元组在一个语句中执行三个赋值。您只需删除自己代码中的空格即可完成或多或少相同的事情。
  • 你说得对,元组就是我的意思。谢谢指出。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多