#linq #resharper
#linq #resharper
Вопрос:
… итак, у меня есть этот код:
foreach (var entry in list)
{
var marginOneEntry = otherList.FirstOrDefault(p => p.Margin == entry.Margin);
if (marginOneEntry == null) continue;
// Do stuff with marginOneEntry
}
и Resharper 5.1 предупреждает меня о «доступе к измененному закрытию» для использования entry
в операторе сравнения в лямбда-выражении. Разве первый вызов по умолчанию не устраняет эту проблему? Мой код плохой или это предупреждение просто недостаток в Resharper?
Примечание: я прочитал другие темы о доступе к измененному закрытию здесь, на SO, но я хочу получить ответ для этого конкретного случая и уточнить, является ли Resharper чрезмерно чувствительным к этому вопросу.
Ответ №1:
Да, это проблема в Resharper, поскольку он не отличает методы с отложенным результатом оценки от методов, которые не используют заданный лямбда-код при отложенной оценке. FirstOrDefault
не выполняет отложенную оценку (забыл термин, противоположный «ленивому»), поэтому его безопасно использовать в вашем примере, но обычно нет способа понять это из подписи метода.
Комментарии:
1. Термин, противоположный ленивому, был бы нетерпеливым.
Ответ №2:
Я думаю, вы допустили ошибку в приведенном выше коде. Ваше .Where(p => entry.Margin == 1)
предварительное условие не связано с перечисляемым элементом. Вы имели в виду p.Margin == 1
вместо этого?
Кроме того, вместо записи x.Where(y).FirstOrDefault()
вы можете просто написать x.FirstOrDefault(y)
.
Комментарии:
1. Что касается FirstOrDefault: Спасибо, я это изменил. Но я имел в виду доступ к переменной записи в предложении Where . Вот почему Resharper реагирует. Однако теперь я изменил фрагмент кода, чтобы он был более реалистичным. Предположим, у нас есть два списка с одинаковыми объектами —
list
иotherlist