c# - 如何编写单个方法而不是具有单个布尔表达式差异的两个方法
问题描述
假设我有两种方法。一种检查完全匹配的注册表项,另一种检查模糊的注册表项检查。
public bool exactCheck(string name)
{
// something common
for(...)
{
string displayName = ... subkey get common code ...
if (name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
// something more common
}
}
// more common
}
public bool vagueCheck(string name)
{
// something common
for(...)
{
string displayName = ... subkey get common code ...
if (displayName.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0)
{
// something more common
}
}
// more common
}
正如您在上面看到的,唯一的区别是此方法中的布尔值。显然,我可以使用 Func 委托,例如,Func<string, string, bool>
如果我不必displayName
在此方法中多次计算。
现在我可以添加一个 bool 来检查它是准确的还是模糊的,并在单个方法中包含 if 语句,如下所示。
public bool exact(string name, string displayName)
public bool vague(string name, string displayName)
public bool exactOrVagueCheck(string name, bool isExact)
{
// ...
for(...)
{
string displayName = ... subkey get common code ...
if ((isExact && exact(name, displayName)) || (!isExact && vague(name, displayName)))
{
// ...
}
}
// ...
}
但这一点都不优雅。有没有更好的方法来实现我想要实现的目标?
解决方案
使用委托。
private bool Check(string name, Func<string, string, bool> compareNames)
{
// ...
for(...)
{
string displayName = ... subkey get common code ...
if (compareNames(name, displayName))
{
// ...
}
}
// ...
}
public bool ExactCheck(string name) => Check(
(name, displayName) => name.Equals(displayName, StringComparison.OrdinalIgnoreCase))
);
public bool VagueCheck(string name) => Check(
(name, displayName) => displayName.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0
);
推荐阅读
- objective-c - 从 Swift 调用 .h 文件中定义的 Objective-C 函数
- c# - 队列将项目移回末尾
- neo4j - Cypher:嵌套 FOREACH 中的匹配节点
- reactjs - 如何使用 Mobx 商店和 Jest 测试组件
- python - 查找具有最大匹配条目/值数量的两个数据框的列
- google-cloud-platform - 保护 Cloud Functions 的 HTTP 端点 - GCP
- python - Python通过Outlook在回复中添加抄送收件人
- react-native - 在反应本机webview上运行janus,webRtc不起作用
- java - 电子邮件附件名称未通过 java 邮件在 Outlook 上解码?
- c# - 如何正确测试库的 .NET Standard 和 Core 版本?