【问题标题】:search logic is doing wrong search?搜索逻辑做错了搜索?
【发布时间】:2015-04-30 14:46:15
【问题描述】:

我们的搜索逻辑有问题。当用户想要搜索区域“团队区域 123”时,由于空间原因,它将搜索姓氏。只是想看看我们怎么能告诉搜索它不是姓氏搜索而你做错了?

public IEnumerable<User> Query()
{
    if (!String.IsNullOrEmpty(query))
    {
        int ext = 0;
        if (query.Contains("."))
        {
            return repository.SelectSearchByEmail(query.Trim());
        }
        else if (query.Contains(","))
        {
            var names = query.Split(',');
            var firstName  = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (query.Contains(" "))
        {
            var names = query.Split(' ');
            var firstName = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (query.Contains("_"))
        {
            var names = query.Split('_');
            var firstName = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (int.TryParse(query, out ext))
        {
            return repository.SelectSearchByExt(ext);
        }
        else
        {
            return repository.SelectAllUserByQuery(query);
        }
    }
    return new List<User>();
}

【问题讨论】:

  • 你的问题让我很困惑,你能试着用其他方式解释你的问题吗?
  • 您的问题不清楚,您在寻求什么帮助?
  • 实际上没有任何方法可以区分包含某人的名字和姓氏的搜索条目与其他条目。计算机不擅长那个;含义上的差异只有人类才能辨别。
  • 用户键入“team Area 123”,因为它认为我正在搜索 First name ,last name 因为查询搜索有空格“”
  • 您在搜索什么?您应该提供一个完整的工作示例,包括当前结果和预期结果。

标签: c# search


【解决方案1】:

试试这样的:

计算字符串中的空格数

// For brevity use.
int spacesCount = query.Count(f => f == ' ');

// For speed use.
int spacesCount = 0;

foreach (char c in query) 
{
    if (c == ' ')
    {
        count++;
    }
}

只有当有 1 个空格时才落入 else,例如"名姓"

所以改变

else if (query.Contains(" "))

到

else if (spacesCount == 1)

您的代码应如下所示:

public IEnumerable<User> Query()
{
    if (!String.IsNullOrEmpty(query))
    {
        int ext = 0;
        int spacesCount = query.Count(f => f == ' ');

        if (query.Contains("."))
        {
            return repository.SelectSearchByEmail(query.Trim());
        }
        else if (query.Contains(","))
        {
            var names = query.Split(',');
            var firstName  = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (spacesCount == 1)
        {
            var names = query.Split(' ');
            var firstName = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (query.Contains("_"))
        {
            var names = query.Split('_');
            var firstName = names[0];
            var lastName = names[1];
            return repository.SelectSearchByFirstAndLastName(firstName, lastName);
        }
        else if (int.TryParse(query, out ext))
        {
            return repository.SelectSearchByExt(ext);
        }
        else
        {
            return repository.SelectAllUserByQuery(query);
        }
    }
    return new List<User>();
}

【讨论】:

    【解决方案2】:

    检查空格时缺少条件:

    public IEnumerable<User> Query()
    {
        if (!String.IsNullOrEmpty(query))
        {
            int ext = 0;
            if (query.Contains("."))
            {
                return repository.SelectSearchByEmail(query.Trim());
            }
            else if (query.Contains(","))
            {
                var names = query.Split(',');
                var firstName  = names[0];
                var lastName = names[1];
                return repository.SelectSearchByFirstAndLastName(firstName, lastName);
            }
            else if (query.Contains(" ") && query.Split(" ").Length ==2 ) //This Line
            {
                var names = query.Split(' ');
                var firstName = names[0];
                var lastName = names[1];
                return repository.SelectSearchByFirstAndLastName(firstName, lastName);
            }
            else if (query.Contains("_"))
            {
                var names = query.Split('_');
                var firstName = names[0];
                var lastName = names[1];
                return repository.SelectSearchByFirstAndLastName(firstName, lastName);
            }
            else if (int.TryParse(query, out ext))
            {
                return repository.SelectSearchByExt(ext);
            }
            else
            {
                return repository.SelectAllUserByQuery(query);
            }
        }
        return new List<User>();
    }
    

    【讨论】:

      【解决方案3】:

      如果我能很好地理解您的问题,那么您可以执行以下操作:

          public IEnumerable<User> Query()
          {
              if (!String.IsNullOrEmpty(query))
              {
                  int ext = 0;
                  if (query.Contains("."))
                  {
                      return repository.SelectSearchByEmail(query.Trim());
                  }
                  else if (query.Contains(","))
                  {
                      var names = query.Split(',');
                      var firstName  = names[0];
                      var lastName = names[1];
                      return repository.SelectSearchByFirstAndLastName(firstName, lastName);
                  }
                  else if (query.Contains(" ") && query.Split(" ").Length == 2)
                  {
                      var names = query.Split(' ');
                      var firstName = names[0];
                      var lastName = names[1];
                      return repository.SelectSearchByFirstAndLastName(firstName, lastName);
                  }
      else if (query.Contains(" ") && query.Split(" ").Length == 3)
                  {
                      //display message wrong search pattern or search by area if you have such method
                      var names = query.Split(' ');
                      var firstName = names[0];
                      var lastName = names[1];
                      return repository.SelectSearchByArea(query.Split(" ")[1]);
                  }
                  else if (query.Contains("_"))
                  {
                      var names = query.Split('_');
                      var firstName = names[0];
                      var lastName = names[1];
                      return repository.SelectSearchByFirstAndLastName(firstName, lastName);
                  }
                  else if (int.TryParse(query, out ext))
                  {
                      return repository.SelectSearchByExt(ext);
                  }
                  else
                  {
                      return repository.SelectAllUserByQuery(query);
                  }
              }
              return new List<User>();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多