|
|
1
1
我们先把问题分解一下。您需要在同一个文件上计算几种不同类型的散列值。暂时假设你 不要 需要实际实例化类型。从已经实例化它们的函数开始:
那很容易。如果文件可能很大,并且您需要对其进行流式处理(请记住,这样做在I/O方面会更昂贵,而在内存方面则更便宜),那么您也可以这样做,它只是更详细一点:
这有点粗糙,在第二种情况下,很难确定linq化版本是否比普通版本更好
既然我们已经解开了散列生成代码的谜团,那么首先实例化散列生成代码就没有那么困难了。同样,我们将从干净的代码开始-使用委托而不是类型的代码:
现在好多了,好处是 允许 在方法中实例化算法,但没有 要求 它。我们可以这样调用它:
如果我们真的,真的,
绝望地
需要从实际开始
就这样。现在我们可以运行这个(坏)代码:
在一天结束的时候,这似乎是更多的代码,但这只是因为我们 组成 解决方案以一种易于测试和维护的方式有效地运行。如果我们想在一个Linq表达式中完成这一切,我们可以:
这就是一切。在这个最终版本中,我跳过了委托的“selector”步骤,因为如果您将所有这些都作为一个函数来编写,那么就不需要中间步骤;之前将它作为单独的函数来编写的原因是在保持编译时类型安全的同时,尽可能地提供灵活性。TY。在这里,我们为了得到Terser代码的好处而放弃了它。
编辑:我将添加一件事,即尽管此代码看起来更漂亮,但它实际上泄漏了
我们再一次失去了清晰的认识。最好先构造实例,然后用
|
|
|
2
4
为什么你提供的类型是
如果这是一个需求,那么您真正拥有的是唯一的解决方案,因为您不能在一个泛型类型或函数上指定一个数量可变的类型参数(这似乎是您需要的,因为它现在是一个数组),并且您不能强制将传入的类型作为一个特定的继承类型行(任何超过您所能强制的整数参数在1到10之间的值)。这种验证只能在运行时进行。 |
|
|
3
1
只是一个小问题,没有什么突破。每当您前移到一个列表上时,都可以使用LINQ。它特别适合一行:
|
|
4
1
像这样的东西怎么样?
WHERE子句限制t参数为hashAlgorithm类型。因此,您可以创建继承自HashAlgorithm的类并实现抽象类成员:
|