2016-02-05 4 views
5

Когда я делаю это:Расхождение в C# LINQ результаты

currentPage = metadataResponse.ApplicationType.Pages.Find(
    page => page.SortOrder == ++currentPage.SortOrder); 

Значение currentPage равно нулю.

Но та же логика, когда я присвоить значение приращения целочисленной переменной, а затем попытаться получить currentPage

int sortOrder = ++currentPage.SortOrder; 
currentPage = metadataResponse.ApplicationType.Pages.Find(
    page => page.SortOrder == sortOrder); 

currentPage получает заселена.

У кого-нибудь есть хороший ответ, почему кто-то работает, а другой нет?

+5

Они не эквивалентны, просто. По-видимому, лямбда оценивается несколько раз (я не знаю, что такое метод «Найти()») и несколько раз меняет порядок сортировки текущей страницы. –

+5

Избегайте лямбда-выражений с побочными эффектами в запросах. –

ответ

6

Примечание: Я предполагаю, что метод Find применяется к совокупности значений.

В первом примере кода вы увеличиваете currentPage для каждого элемента вашей коллекции (это происходит потому, что лямбда-выражения вводят замыкания по переменным, захваченным из внешней области видимости - см. Ниже блок кода для получения дополнительной информации об этом). Во втором примере кода currentPage увеличивается только один раз. Посмотрите, как следующая программа ведет себя:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Func1(); 
     Console.WriteLine("\n"); 
     Func2(); 

     Console.ReadKey(); 
    } 

    private static void Func1() 
    { 
     int i = 0; 
     var list = new List<int> { 1, 2, 3 }; 
     list.ForEach(x => Console.WriteLine(++i)); 
    } 

    private static void Func2() 
    { 
     int i = 0; 
     int j = ++i; 
     var list = new List<int> { 1, 2, 3 }; 
     list.ForEach(x => Console.WriteLine(j)); 
    } 
} 

Here еще некоторая информация о замыканиях в лямбда-выражениях. Повеселись! ;-)

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