2012-06-25 9 views
7

Disclaimer: questa domanda è guidata dalla mia curiosità personale più che da un effettivo bisogno di realizzare qualcosa. Quindi il mio esempio sarà ideato. Tuttavia penso che sia un problema che potrebbe benissimo emergere.Utilizzo di LINQ's Zip con una chiusura che non restituisce un valore

Diciamo che stiamo usando Zip per iterare su due sequenze, invocando un metodo di annullamento che solleva un'eccezione se un elemento della coppia risulta essere diverso dall'altro (quindi scartando qualsiasi valore di ritorno). Il punto qui non è che il metodo lancia un'eccezione, tanto quanto restituisce nulla.

In altre parole, stiamo facendo uno ForEach su due raccolte (e, a proposito, so cosa Eric Lippert thinks about ForEach).

Ora, vuole un Func<TFirst, TSecond, TResult>, quindi ovviamente il passaggio equivalente a Action<TFirst, TSecond> non funzionerà.

La mia domanda è: c'è un modo idiomatico migliore di questo (cioè restituire un valore fittizio)?

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

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

correlati Eric Lippert post sul blog: http://blogs.msdn.com/b/ericlippert/archive/2009/06/29/the-void-is-invariant.aspx – AakashM

risposta

15

Usa Zip() di gettare gli oggetti in un oggetto, quindi fare il vostro foreach tuttavia modo si sceglie (fare un normale ciclo foreach per favore, non il male ToList/ForEach combinata).

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

dolce, mi piace. Grazie! –

Problemi correlati