2013-07-17 2 views
2

Привет У меня есть следующий код:LINQ и ReSharper

if (!_jobs.Any(j => j.Id == emailJob.Id)) 
{ 
} 

Этот код должен найти какие-либо элементы, которые удовлетворяют условию. Поэтому я хотел бы предположить, что он должен вернуться после того, как найти первый элемент, что-то вроде этого:

if (!_jobs.FirstOrDefault(j => j.Id == emailJob.Id) != null) 
{ 
} 

Resharper пытается упростить это выражение LINQ к:

if (_jobs.All(j => j.Id != emailJob.Id)) 
{ 
} 

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

Извините, если я просто не понимаю, как работает LINQ.

Джо

+0

Это зависит, действительно. –

+0

вам нужно будет проверить весь список, если все они будут отличаться от этого Идентификатора в любом случае. Даже в первом примере. –

+1

Как вы можете сказать, что у человека X нет красных носков, когда в ящике все еще есть носок, на который вы еще не смотрели? –

ответ

3

Как Any, так и All прекратят поиск сразу после неисправного состояния.

Если вы ищете больше, чем просто слово или анекдотические свидетельства, вы можете видеть из источника, что это то, что он делает.

Decompiled Any and All methods

Существует дополнительная инверсия в методе All после того, как предикат применяется. Это относительное влияние на производительность, поэтому читаемость кода является главной задачей.

+0

Я вижу - я должен был действительно понять это, не уверен, что со мной сегодня не так. Благодарю. – JoeS

7

Оба варианта являются зеркальными подходами и сделать точно такой же объем работы.

Когда вы говорите «если ни из элементов не удовлетворяет этому условию» (!Any), затем все из элементов должны быть проверены для того, чтобы получить определенный ответ.

Предложение ReSharper полезно, потому что оно направляет вас на использование метода, который более четко показывает, что произойдет: All работы должны быть рассмотрены.

+4

Я думаю, что самое важное здесь - это предложение не для эффективности, а для читаемости. –

+0

Но в этом случае это не имеет значения. –

1

Если есть работа, которая соответствует идентификатору emailJob, то подход .Any() может прерваться раньше. Точно так же подход .All() может перестать работать, как только он найдет условие, которое является ложным, что произойдет при той же работе. Эффективность должна быть примерно одинаковой.

Смежные вопросы