他在优化算法

Optimize the Algotithm

所以,我有一个方法

public void AddToSearch(List<FullName> fullNames)
        {
            foreach (var fullName in fullNames)
            {
                if (fullName.Surname != null)
                    _sb.Append(fullName.Surname.Trim() + " ");
                if (fullName.Name != null)
                    _sb.Append(fullName.Name.Trim() + " ");
                if (fullName.Patronymic != null)
                    _sb.Append(fullName.Patronymic.Trim());
                fullNamesList.Add(_sb.ToString().TrimEnd());
                _sb.Clear();
            }

它需要一个全名列表,并通过使用 StringBuilder 实例将每个元素转换为一个字符串(格式为“$Surname $Name $Patronymic”)。最后,我将结果放入我的列表中。问题是——我怎样才能优化所有那些“Trim”的东西。这让我很困扰,我在多个场合使用它,我很确定它会影响时间。

尝试像这样扩展。

public static class Helper
{
  public static StringBuilder AppendValue(this StringBuilder builder,string value)
  {
    if(!string.IsNullOrEmpty(value))
    {
      builder.Append(value.Trim());
      return builder;
    }
  }
}

调用如下:

sb.AppendValue(fullName.Name);
sb.AppendValue(fullName.Surname);
...

如果 StringBuilder 不为空,您将返回带有值的值,否则不会向其中添加任何内容。

how can i optimize all of that "Trim" stuff

很简单,就是不要在这些字符串上调用 Trim()。您担心哪些空间?谁在您的业务对象中输入这些值?因为没有太阳耀斑随机翻转位足以在字符串中附加空格,所以您从头到尾都处于完全控制状态,所以根本不要添加空格。

您也不需要这两个字符串构建器,只需插入您的主要字符串构建器即可。这里也不需要另一个 Trim(),因为简单地递减字符串构建器的 Length 属性 是一个常量操作(它确实递减一个整数,保证没有额外分配)。

字符串规范化过程应该在存储字符串的数据层(在应用程序或数据库中)完成。而动态字符串(例如用户输入)需要在获取它们后立即进行规范化,以便为下一个任务做好准备。

对于您当前的代码,您可以修改 FullName class,将设置器调整为 trim 存储之前的值,并将 ToString 覆盖为return全名。

示例:

public class FullName
{       
    public string Name 
    {
        get => Name;
        set => Name = value?.Trim();
    }
    
    public string Surname 
    {
        get => Surname;
        set => Surname = value?.Trim();
    }
    
    public string Patronymic 
    {
        get => Patronymic;
        set => Patronymic = value?.Trim();
    }

    public override string ToString()
    {
        return $"{GetValueOrEmpty(Surname)}{GetValueOrEmpty(Name)}{GetValueOrEmpty(Patronymic, false)}";
    }
    
    private string GetValueOrEmpty(string name, bool addSpaceAfter = true)
    {
        if(!string.IsNullOrWhiteSpace(name))
        {
            return name + (addSpaceAfter ? " " : string.Empty);
        }
        
        return string.Empty;
    }
}

那么,你可以这样做:

fullNamesList.AddRange(fullNames.Select(x=> x.ToString()));

更新:

感谢@olivier-jacot-descombes,上面的代码没有使用backing fields,这样可以避免属性无限递归导致溢出异常。以下调整将起到作用。

public class FullName
{      
    private string _name;
    private string _surname;
    private string _patronymic;
    
    public string Name 
    {
        get => _name;
        set => _name = value?.Trim();
    }
    
    public string Surname 
    {
        get => _surname;
        set => _surname = value?.Trim();
    }
    
    public string Patronymic 
    {
        get => _patronymic;
        set => _patronymic = value?.Trim();
    }

    public override string ToString()
    {
        return $"{GetValueOrEmpty(Surname)}{GetValueOrEmpty(Name)}{GetValueOrEmpty(Patronymic, false)}";
    }
    
    private string GetValueOrEmpty(string name, bool addSpaceAfter = true)
    {
        if(!string.IsNullOrWhiteSpace(name))
        {
            return name + (addSpaceAfter ? " " : string.Empty);
        }
        
        return string.Empty;
    }
}