2012-06-19 9 views
6

Byłem eksperymentujących z Linq aby zobaczyć, co może zrobić - i jestem naprawdę kochać go tak daleko :)LINQ odroczyć wykonanie z wartościami lokalnych

Napisałem kilka zapytań dla algorytmu, ale nie zrobił” t uzyskać oczekiwane rezultaty ja ... wyliczenia zawsze zwrócony pusty:

sprawa # 1

List<some_object> next = new List<some_object>(); 
some_object current = null; 

var valid_next_links = 
    from candidate in next 
    where (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime) 
    orderby candidate.fromTime 
    select candidate; 

current = something; 
next = some_list_of_things; 

foreach (some_object l in valid_next_links) 
{ 
    //do stuff with l 
} 

Zmieniłem zgłoszenia zapytania być inline tak, i to działa dobrze:

przypadek # 2

foreach (some_object l in 
     (from candidate in next 
     where (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime) 
     orderby candidate.fromTime 
     select candidate)) 
{ 
    //do stuff with l 
} 

Czy ktoś wie dlaczego to nie działa w przypadku # 1? Sposób, w jaki to zrozumiałam, zapytanie nie było oceniane, gdy je zadeklarowałeś, więc nie widzę różnicy.

Odpowiedz

7

Zmiany do current zostaną przechwycone, ale zapytanie już zna wartość o wartości z next. Dodanie dodatkowych elementów do istniejącej listy spowoduje ich wyświetlenie w zapytaniu, ale zmiana wartości zmiennej w celu odniesienia się do innej listy nie będzie miała żadnego efektu. Zasadniczo, jeśli mentalnie rozszerzysz zapytanie z wyrażenia zapytania do "normalnej" postaci, każda zmienna występująca w wyrażeniu lambda zostanie przechwycona jako zmienna, ale każda zmienna występująca bezpośrednio jako argument zostanie natychmiast oceniona. To będzie przechwytywać tylko wartość zmiennej o wartości , a nie pozycje obecne na liście, ale nadal oznacza to, że sama zmiana wartości zmiennej nie będzie widoczna. Twoje pierwsze zapytanie rozszerza się na:

var valid_next_links = next 
     .Where(candidate => (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime)) 
     .OrderBy(candidate => candidate.fromTime); 
Powiązane problemy