Почему я не могу получить доступ к переменной внутри тела метода, в которой она была передана в качестве предиката функции LINQ? - PullRequest
0 голосов
/ 15 ноября 2018

Я попытался получить доступ к лямбда-переменной внутри метода, но был удивлен, что не смог. Более конкретно, что касается кода ниже, я обратился к переменной item, которую я передал в вызов IEnumerable.Any() в качестве предиката в качестве средства доступа к свойствам этого конкретного элемента. Но я не смог этого сделать.

Конечно, если я передаю элемент в качестве параметра методу, я получу доступ к нему в теле метода. Но это не так. Почему это? Как я могу изменить свой код, чтобы иметь доступ к свойствам item?

if (list.Any(item => item.questions == null))
            {
                throw new ArgumentException($"Item {item.Name} cannot be null"); //<-- Error here, "item" does not exist in current context.
            }

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы не можете этого сделать.Лямбда-выражение - это в основном анонимный метод со своей областью действия.

Вместо этого вы можете сделать следующее:

var nulls = list.Where(item => item.questions == null);

if (nulls.Any())
{
    throw new ArgumentException(String.Format("Item {0} cannot be null"), nulls.First().Name)); 
}
0 голосов
/ 15 ноября 2018

Лямбда-выражение item => ... определяет область действия, элемент будет доступен только внутри лямбда-выражения.Если вам нужно найти конкретный предмет, попробуйте это:

var firstItemWithoutQuestions = list.FirstOrDefault(item => item.questions == null);
if (firstItemWithoutQuestions != null) 
{
   throw new ...
}
0 голосов
/ 15 ноября 2018

Если мы посмотрим на ваш код:

if (
    list.Any(item => item.questions == null) // <-- item is only in scope of Any!
)
{
    throw new ArgumentException($"Item {item.Name} cannot be null");
}

В строке 2 фрагмента, который у вас есть, этот элемент можно использовать только внутри Any, но не внутри if-body.

вы можете сделать ForEach над коллекцией, но исключение будет брошено только на первый элемент

list.Foreach(item => 
{
    if(item.questions == null)
        throw new ArgumentException($"Item {item.Name} cannot be null");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...