首页 > 解决方案 > 如何编写单个方法而不是具有单个布尔表达式差异的两个方法

问题描述

假设我有两种方法。一种检查完全匹配的注册表项,另一种检查模糊的注册表项检查。

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)))
    {
      // ...
    }
  }
  // ...
}

但这一点都不优雅。有没有更好的方法来实现我想要实现的目标?

标签: c#func

解决方案


使用委托。

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
);


推荐阅读