﻿# V3220\. The result of the LINQ method with deferred execution is never used\. The method will not be executed\.

Анализатор обнаружил, что результат LINQ метода с отложенным выполнением не исполняется\.

Рассмотрим пример: 

```cpp
public static void PrintNames(List<string> names, char startLetter)
{
  int it = 0;
  var filteredNames = names.Where(name => 
                      {
                        ++it;
                        Console.WriteLine($"{it}) {name}");
                        return name.StartsWith(startLetter); 
                      });

  Console.WriteLine($"Type: '{filteredNames.GetType()}'");
  Console.WriteLine(String.Join(',', names));
}
```

В метод `Where` передаётся делегат, который, помимо условия фильтрации, выводит на консоль элементы и их позиции из исходной коллекции\. 

Однако ни вывода имён с позициями, ни фильтрации не произойдёт\. В метод `String.Join` вместо `filteredNames`предаётся `names`\. По этой причине отфильтрованная коллекция не будет выведена на консоль\. Более того, фильтрация в принципе не будет выполнена\. Подобное поведение обусловлено тем, что при вызове `Where` фильтрация выполняется не в момент вызова, а является отложенной\. Следовательно, до тех пор, пока не будет произведено итерирование по коллекции, код делегата не выполнится\.

Подробнее об отложенном выполнении можно узнать [здесь](https://learn.microsoft.com/en-us/dotnet/csharp/linq/get-started/introduction-to-linq-queries)\.

Стоит отметить, что после вызова `Where` с помощью метода `GetType` выводится тип коллекции\. При вызов данного метода не выполняется итерирование по коллекции, из чего следует, что делегат, переданный в `Where`, также не отработает\.

Для исправления в `String.Join` нужно предавать не `names`, а `filteredNames`:

```cpp
public static void PrintNames(List<string> names, char startLetter)
{
  int it = 0;
  var filteredNames = names.Where(name => 
                      {
                        ++it;
                        Console.WriteLine($"{it}) {name}");
                        return name.StartsWith(startLetter); 
                      });

  Console.WriteLine($"Type: '{filteredNames.GetType()}'");
  Console.WriteLine(String.Join(',', filteredNames));
}
```

При вызове `String.Join` будет выполнено итерирование по `filteredNames`, что запустит фильтрацию коллекции\. Следовательно, код делегата выполнится, и элементы с позициями будут выведены на консоль\. Также на консоль выведется отфильтрованная коллекция\.