使用带有不返回值的闭包的LINQ的Zip

s.m*_*.m. 11 c# linq func

免责声明:这个问题是由我个人的好奇心推动而不是实际需要完成的事情.所以我的例子将会做作.尽管如此,我认为这个问题很可能会突然出现.

假设我们正在使用Zip迭代两个序列,调用一个void方法,如果发现该对中的一个项与另一个项不同(因此丢弃任何返回值),则抛出异常.这里的要点不是该方法抛出异常,而是返回void.

换句话说,我们做ForEach了两个以上的收藏(顺便说一句,我知道Eric Lippert的想法ForEach,完全同意他并且从不使用它).

现在,Zip想要一个Func<TFirst, TSecond, TResult>,所以当然传递相当于的东西是Action<TFirst, TSecond>行不通的.

我的问题是:是否存在比这更好的惯用方法(即返回虚拟值)?

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

collection1.Zip(collection2, (first, second) => 
{
    VoidMethodThatThrows(first, second);
    return true;
});
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 20

使用Zip()投掷物品放入一个对象,然后做你foreach不过这样你选择(做一个正常的foreach循环请,而不是 ToList /组合的ForEach).

var items = collection1.Zip(collection2, (x, y) => new { First = x, Second = y });
foreach (var item in items)
{
    VoidMethodThatThrows(item.First, item.Second);
}
Run Code Online (Sandbox Code Playgroud)

从C#7.0开始,改进的元组支持和解构使得它更令人愉悦.

var items = collection1.Zip(collection2, (x, y) => (x, y));
// or collection1.Zip(collection2, ValueTuple.Create);
foreach (var (first, second) in items)
{
    VoidMethodThatThrows(first, second);
}
Run Code Online (Sandbox Code Playgroud)