c#, убрать дублирование if
Метод определяет вложен ли один прямоугольник в другой и выводит номер (с нуля) внутреннего.
Иначе возвращает -1. Если прямоугольники совпадают, можно вернуть номер любого из них.
Как убрать дублирование кода?
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
{
if (r1.Left <= r2.Left && r1.Right >= r2.Right && r1.Top <= r2.Top && r1.Bottom >= r2.Bottom)
return 1;
else if (r1.Left >= r2.Left && r1.Right <= r2.Right && r1.Top >= r2.Top && r1.Bottom <= r2.Bottom)
return 0;
else
return -1;
}
Ответы (2 шт):
Например вот так
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
{
if (IsInner(r2, r1))
return 1;
if (IsInner(r1, r2))
return 0;
return -1;
}
private static bool IsInner(Rectangle r1, Rectangle r2)
{
return r1.Left >= r2.Left && r1.Right <= r2.Right && r1.Top >= r2.Top && r1.Bottom <= r2.Bottom;
}
Можно даже основной метод записать с помощью двух тернарных операторов
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
{
return IsInner(r2, r1) ? 1 : IsInner(r1, r2) ? 0 : -1;
}
И синтаксически оба метода можно записать в форме выражения
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
=> IsInner(r2, r1) ? 1 : IsInner(r1, r2) ? 0 : -1;
private static bool IsInner(Rectangle r1, Rectangle r2)
=> r1.Left >= r2.Left && r1.Right <= r2.Right && r1.Top >= r2.Top && r1.Bottom <= r2.Bottom;
Но eсть еще способ - Rectangle.Contains, встроенный метод. Спасибо @AlexanderPetrov за подсказку. Я когда готовил ответ, искал что-то подобное, но не нашел.
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
=> r2.Contains(r1) ? 1 : r1.Contains(r2) ? 0 : -1;
@aepot предложил лучшее решение (за которое я тоже проголосовал), однако если бы дело касалось не прямоугольников, а какой-то другой логики я бы сократил так:
public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
{
int q = r1.Left <= r2.Left ? 1 : 0;
q += r1.Right >= r2.Right ? 1 : 0;
q += r1.Top <= r2.Top ? 1 : 0;
q += r1.Bottom >= r2.Bottom ? 1 : 0;
if ( q == 4)
return 1;
else if (q == 0)
return 0;
return -1;
}
вариант для ретурна по таблице истинности тогда условия не нужны:
return [0,-1,-1,-1, 1][q]
иногда так можно сократить код
