Подтвердить что ты не робот

Почему Решарпер предполагает, что я упрощаю "не равную" по отношению ко всем "не равным"?

Мне нужно проверить, нет ли элемента в списке элементов на С#, поэтому у меня есть эта строка:

if (!myList.Any(c => c.id == myID))) 

Resharper предлагает мне изменить это на:

if (myList.All(c => c.id != myID))) 

Я вижу, что они эквивалентны, но почему он предлагает изменение? По какой-то причине первая реализация медленнее?

4b9b3361

Ответ 1

Слишком легко пропустить ! в начале выражения в первом примере. Поэтому вы затрудняете чтение выражения. Кроме того, первый пример читается как "не равный", тогда как второй "все не равны". Не случайно, что более легкий для чтения код может быть выражен как более простой для чтения на английском языке.

Легче читать код, скорее всего, будет менее глючным, так как он легче понять, что он делает, прежде чем менять его. Это потому, что второй пример более ясен, что ReSharper рекомендует изменить ваш код.

Ответ 2

Читабельность выражения - это личное мнение.

Я бы это прочитал

if (!myList.Any(c => c.id == myID))) 

как 'мой элемент не в коллекции'. Где это

if (myList.All(c => c.id != myID))) 

читает как "все элементы в коллекции, отличные от моего элемента".

Если "вопрос", который я хочу задать - через мой запрос linq - это "мой элемент не в списке", тогда первый запрос лучше подходит для вопроса, который я хочу задать. ! перед первым запросом не проблема.

Ответ 3

В целом задание положительного вопроса более интуитивно. Если вы спросили пользователя "Неужели вы не хотите удалять эту запись?", Угадайте, как часто он нажимает неправильную кнопку.

Мне лично нравится создавать такие конструкции вокруг:

// Not optimal
if (!x) {
    A();
} else }
    B();
}

// Better
if (x) {
    B();
} else }
    A();
}

Исключением может быть тест для not null, где a != null может восприниматься как положительный.