免责声明:这个问题是由我个人的好奇心推动而不是实际需要完成的事情.所以我的例子将会做作.尽管如此,我认为这个问题很可能会突然出现.
假设我们正在使用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)
归档时间: |
|
查看次数: |
2136 次 |
最近记录: |