2010-10-26 5 views
27

Co ja tu robię źle? Jak mogę wykonać moje działanie?Wywołanie rekurencyjne - działanie lambda

var recurse = new Action<IItem, Int32>((item, depth) => 
{ 
    if (item.Items.Count() > 0) recurse(item, depth + 1); // red squiggly here 

    // ... 
}); 

Dostaję czerwoną falowane Dzwoniąc recurse mówiąc „metoda, przekazać lub wydarzenie oczekiwane”.


Aktualizacja

Mam akceptowane odpowiedź Homam użytkownika. Chciałbym tylko dodać/dzielić inną składnię samo ... Ale co uważam nieco łatwiej na oczy ...

Action<IEnumerable<Item>> Recurse = null; 

Recurse = item => 
{ 
    if (item.Items != null) Recurse(item.Items); 

    // ... 
}; 

Odpowiedz

48

Wystarczy zdefiniować delegata Action i przypisać do niego zerowy przed nazywając ją rekurencyjnie.

Action<IItem, Int32> recurse = null; 

Następnie

recurse = new Action<IItem, Int32>((item, depth) => 
{ 
    if (item.Items.Count() > 0) recurse(item, depth + 1); // red squiggly here 
    // ... 
}); 

Powodzenia!

+0

Nie chciałbym dzielić definicji i implementacji. Czy jest jakiś sposób, aby to zrobić w jednym wierszu kodu? – roosteronacid

+6

Nie. Eric wyjaśnia, dlaczego w swoim wpisie na blogu (jak zwykle się pojawia): http://blogs.msdn.com/b/ericlippert/archive/2006/08/18/706398.aspx –

+0

@Ron: Nice tidbit. Ma jakiś dziwny sens :) – roosteronacid