Шаблон ReSharper Search для .First([С условием]), игнорирующий .First()

Как следует из заголовка, есть ли способ с помощью шаблона поиска ReSharper найти все экземпляры .First(), которые содержат условие, игнорируя .First()?

Мотивация этого поиска связана с ответом на вопрос
Почему LINQ .Where(предикат).First() быстрее, чем .First(предикат)?

Мы хотели бы увидеть, сколько раз мы используем First() с условием. Поиск будет расширен для поиска .FirstOrDefault().


person paligap    schedule 05.07.2013    source источник
comment
Вероятно, вы потратите больше времени на поиск экземпляров First с предикатом, чем время выполнения таких вызовов вместе взятых. Вас так беспокоит такая микрооптимизация?   -  person    schedule 05.07.2013
comment
Улучшение ~30% все еще является улучшением. Особенно при работе с большими списками. Вы подразумеваете, что критерии поиска не могут быть созданы?   -  person paligap    schedule 05.07.2013
comment
Он не говорит, что это не улучшение, и не говорит, что это невозможно. Он говорит, что время, необходимое для его изменения, вероятно, будет больше, чем время, сэкономленное на его изменении. 30% чего-то очень маленького — это что-то еще меньшее. Вы уверены, что это самая большая проблема с производительностью в вашем приложении?   -  person AakashM    schedule 05.07.2013
comment
Используя информацию, предоставленную Джо Уайтом, изменение кодовой базы заняло всего несколько секунд.   -  person paligap    schedule 11.07.2013


Ответы (2)


Вы создаете шаблон для этого примерно так, как вы ожидаете. Перейдите в ReSharper > Найти > Поиск по шаблону и введите этот шаблон:

$enumerable$.First($args$)

Затем в списке заполнителей справа создайте два заполнителя:

  • Добавьте Заполнитель > Выражение и назовите его enumerable. Не указывайте тип (я пытался указать тип как IEnumerable<out T> и потомков, но по какой-то причине не нашел никаких применений, но если вы не укажете тип, он работает).
  • Добавьте заполнитель > Аргумент, назовите его args, установите флажок «Ограничить минимальное количество аргументов» и оставьте число равным 1.

Я проверил это, и он нашел list.First(i => i%2 == 0), но не list.First(), так что это именно то, что вы просите.

person Joe White    schedule 05.07.2013
comment
Отличное решение, Джо, и с ReSharper было легко реализовать замену. Спасибо. - person paligap; 05.07.2013

Вы можете просто использовать VisualStudio Find и использовать опцию RegEx

Что-то вроде: .First(\({.+}\));

введите здесь описание изображения

И вы также можете использовать «Найти и заменить», чтобы изменить все ваши предикаты на Where +First`

введите здесь описание изображения

person sa_ddam213    schedule 05.07.2013