2012-06-25 12 views
7

Zrzeczenie się: to pytanie jest spowodowane moją osobistą ciekawością bardziej niż faktyczną potrzebą osiągnięcia czegoś. Mój przykład zostanie wymyślony. Niemniej jednak myślę, że to kwestia, która może bardzo dobrze się pojawić.Używanie zamka LINQ z zamknięciem, które nie zwraca wartości

Załóżmy, że używamy Zip do iteracji w dwóch sekwencjach, wywołując metodę void, która właśnie zgłasza wyjątek, jeśli okaże się, że jeden element pary różni się od drugiego (dlatego odrzuca jakąkolwiek wartość zwracaną). Chodzi o to, że metoda nie zgłasza wyjątku, ponieważ zwraca nieważne.

Innymi słowy, robimy rodzaj ForEach w dwóch kolekcjach (a przy okazji, wiem, co Eric Lippert thinks about ForEach).

Teraz Zip chce Func<TFirst, TSecond, TResult>, więc oczywiście przekazanie czegoś równoważnego Action<TFirst, TSecond> nie będzie działać.

Moje pytanie brzmi: czy istnieje idiomatyczny sposób, który jest lepszy od tego (tj. Zwracanie wartości dummy)?

var collection1 = new List<int>() { ... }; 
var collection2 = new List<int>() { ... }; 

collection1.Zip(collection2, (first, second) => 
{ 
    VoidMethodThatThrows(first, second); 
    return true; 
}); 
+2

związane Eric Lippert blogu: http://blogs.msdn.com/b/ericlippert/archive/2009/06/29/the-void-is-invariant.aspx – AakashM

Odpowiedz

15

użytkowania Zip() rzucić elementy do obiektu, a następnie wykonać foreach jednak sposób wyboru (do normalnej foreach pętlę proszę, nie złe ToList/ForEach kombi).

var items = collection1.Zip(collection2, (x, y) => new { First = x, Second = y }); 
foreach (var item in items) 
{ 
    VoidMethodThatThrows(item.First, item.Second); 
} 
+0

Słodki, lubię go. Dzięki! –

Powiązane problemy