Disclaimer: this question is driven by my personal curiosity more than an actual need to accomplish something. So my example is going to be contrived.
Nevertheless I think it’s an issue that might very well crop up.
Let’s say we are using Zip to iterate over two sequences, invoking a void method that just throws an exception if one item of the couple is found to be different from the other (therefore discarding any return value). The point here is not that the method throws an exception, so much as it returns void.
In other words, we’re kind of doing a ForEach over two collections (and by the way, I know what Eric Lippert thinks about ForEach, and fully agree with him and never use it).
Now, Zip wants a Func<TFirst, TSecond, TResult>, so of course passing something equivalent to Action<TFirst, TSecond> won’t work.
My question is: is there an idiomatic way that is better than this (i.e. returning a dummy value)?
var collection1 = new List<int>() { ... };
var collection2 = new List<int>() { ... };
collection1.Zip(collection2, (first, second) =>
{
VoidMethodThatThrows(first, second);
return true;
});
Use
Zip()to throw the items into an object, then do yourforeachhowever way you choose (do a normalforeachloop please, not the bad ToList/ForEach combo).As of C# 7.0, improved tuple support and deconstruction makes it far more pleasing to work with.
Furthermore, .NET Core and 5 adds an overload which automatically pairs the values into tuples so you don’t have to do that mapping.
.NET 6 adds a third collection to the mix.