цепочка bools в C #

2
int a, b, c, d, e;
a = b = c = d = e = 1;

if ((a==b) && (b==c) && (c==d) && (d==e))
{
    Console.WriteLine("that syntax is horrible");
}

есть ли более элегантный способ проверить множественное равенство, как указано выше?

может быть AreEqual(params obj[]) или что-то еще? У меня был Google, но ничего не нашел.

  • 0
    Элегантный: (a & b & c & d & e) == (a | b | c | d | e), но не так легко понять.
Теги:

5 ответов

10
Лучший ответ

Возможная реализация AreEqual(params object[] objects):

(Следуя совету Джона Скита, здесь общая версия)

bool AreEqual<T>(params T[] objects)
{
    if (objects.Length <= 1) return true;
    return objects.Skip(1).All(x => x.Equals(objects[0]));
}

Skip(1) также не является строго необходимым.

  • 2
    да, linq это путь :-)
  • 0
    спасибо Aviad, я знаю, что это тривиально реализовать, просто подумал, что уже может быть подходящий метод.
Показать ещё 4 комментария
4

Вот общая версия, которая позволит избежать бокса (и быть более безопасным во время компиляции):

public static bool AllEqual<T>(T firstItem, params T[] items)
{
    // Omitted error checking
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    foreach (T item in items)
    {
        if (!comparer.Equals(firstItem, item))
        {
            return false;
        }
    }
    return true;
}

Обратите внимание, что это будет не так удобно, если вы действительно хотите передать кучу значений, которые вы уже получили в массиве, но избегаете проблем с пустыми массивами - и означает, что у вас нет избыточных сравнений.

  • 0
    Это не то же самое, что оригинал; (если вы переопределите 'Equals', это будет использовать эту реализацию).
  • 1
    @silky: Какую версию вы предлагаете не использовать переопределенные Equals? Единственная разница будет в том, если кто-то реализует Equals (объект) иначе, чем его реализация IEqualityComparer - в этом случае у него возникают большие проблемы с IMO.
Показать ещё 9 комментариев
3

Нет, это самый разумный способ (я имею в виду наиболее читаемый, что является самым важным).

Реальный вопрос: зачем вам это нужно? Похоже, что плохой дизайн в первую очередь...

  • 0
    с какой стати может быть плохим дизайном необходимость проверять, равняется ли куча вещей? Вы честно говорите, что нет никаких причин, чтобы когда-либо это делать? это именно тот комментарий «общего мнения», который я нахожу таким разочаровывающим с этим сайтом. Хотите, чтобы я опубликовал все 50К строк кода, чтобы вы могли понять, почему я хочу это сделать?
  • 0
    В значительной степени я говорю, что да; нет особой причины расстраиваться из-за моего ответа. Я оставлю тебя к этому.
Показать ещё 1 комментарий
0

Если вы сравниваете простые типы, и у вас есть только несколько вариантов использования, вы можете создать несколько полезных методов, таких как:

    bool AllEqual(int first, params int[] numbers)
    {
        return numbers.All(x => x == first);
    }
0

Это весело

int a, b, c, d, e;
a = b = c = d = e = 1;

if ((a & b & c & d) == e)
{
    Console.WriteLine("that syntax is horrible");
}

Забастовкa >

и, возможно, лучше

int a, b, c, d, e;
a = b = c = d = e = 1;
if (new[] {a, b, c, d, e}.All(i => i == a))
{
    Console.WriteLine("Funky chicken");
}
  • 0
    Этот код даст неправильные результаты. Обратите внимание, что & делает побитово и. Результат оказывается правильным, если все значения равны, но он может быть неправильным для разных значений (т. Е. Результат все равно будет true хотя значения не все равны).
  • 0
    хех так оно и есть :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню