-1

我正在做一个 Web 应用程序,其中有一个用于搜索对象列表的文本框。

对象是这样的:

    public class Project : IDbProject
    {
      public string ProjectName { get; set; }
      public string Country { get; set; }
      public string Customer { get; set; }
      public DateTime UploadDate { get; set; }
      public DateTime CreateDate { get; set; }
      public string CreatedBy { get; set; }
    }

, 列表是IList<IProject>. 我的搜索/过滤正在通过列表,并与对象中的每个字符串进行比较,例如:

        public IList<IProject> GetSearchedProjects(string searchString)
        {

       foreach (var proj in _projects)
                {

                    if (InputStartWithSearch(proj.ProjectName, searchString) && !searchProjects.Contains(proj))
                        {
                            searchProjects.Add(proj);
                            continue;
                        }
                    if (InputStartWithSearch(proj.Country, searchString) && !searchProjects.Contains(proj))
                        {
                            searchProjects.Add(proj);
                            continue;
                        }
                    if (InputStartWithSearch(proj.CreatedBy, searchString) && !searchProjects.Contains(proj))
                        {
                            searchProjects.Add(proj);
                            continue;
                        }
                    if (InputStartWithSearch(proj.ProjectState, searchString) && !searchProjects.Contains(proj))
                        {
                            searchProjects.Add(proj);
                            continue;
                        }
                    if (IsStringDate(searchString))
                        if (IsDatesEqual(proj.CreateDate, searchString) && !searchProjects.Contains(proj))
                        {
                            searchProjects.Add(proj);
                        }
                    }
            return searchProjects;

        }
        return _projects;
    }

正如你所看到的,我已经做了很多私有方法来检查搜索字符串与对象的字符串/日期/任何东西。这一切都很好。

但是有没有更好/更快的方法来通过单个字符串在对象列表中搜索?

编辑

方法InputStartWithSearchIsStringDate是私有方法,我检查输入字符串是否以项目数据开头。因此,如果 CreatedBy 是“Matthi Smith Junior”,并且我搜索了“Matthi Junior”、“Matthi Smith”、“Smith Junior”等,它会添加它。

IsStringDate 正在检查搜索字符串是否等于日期时间格式。所以它包含一个格式数组,并检查搜索字符串是否为该格式。

4

4 回答 4

2

你想要的是一个重载的方法:

bool InputStartWithSearch(string search, params string[] inputs)
{
     return inputs.Any(i => InputStartWithSearch(i, string));
}

然后你可以像这样使用它:

if (InputStartWithSearch(searchString, proj.ProjectName, proj.Country, proj.CreateDate))
{
    searchProjects.Add(proj);
}

您可以根据需要制作要检查的字符串列表。

颠倒原始方法中参数的顺序可能是一个好主意,以使事情变得不那么混乱。

要直接使用 LINQ 获取匹配项目的列表,您可以执行以下操作:

var matchingProjects = _projects.Where(i => InputStartWithSearch(searchString, i.ProjectName, i.Country, i.CreateDate));
于 2013-10-24T09:42:34.427 回答
0

你可以使用 linq。同样,它不是更快,但代码更简单。

public IList<IProject> GetSearchedProjects(string searchString)
{
    return (from p in _projects 
            where searchProjects.Contains(p) &&
                  (InputStartWithSearch(p.ProjectName, searchString) || 
                  InputStartWithSearch(p.Country, searchString) ||
                  InputStartWithSearch(p.CreatedBy, searchString) || 
                  DateToString(p.CreateDate).Contains(searchString.ToLower()))
            select p).ToList();
}
于 2013-10-24T09:12:29.260 回答
0

首先,您可以将 searchProjects.Contains() 检查重构为循环顶部的保护语句。那会简化事情。然后,您可以将每个项目的属性连接成一个带有唯一分隔符的字符串。那么搜索就更容易了。这并不比您现有的方法快,只是更短。

public IList<IProject> GetSearchedProjects(string searchString)
{
    foreach (var proj in _projects)
    {
        if (!searchProjects.Contains(proj))
            continue;
        StringBuilder sb = new StringBuilder();
        sb.Append("|").Append(proj.ProjectName);
        sb.Append("|").Append(proj.Country);
        sb.Append("|").Append(proj.CreatedBy);
        sb.Append("|").Append(proj.UploadDate.ToString());

        if (sb.ToString().Contains("|" + searchString))
            searchProjects.Add(proj);
    }
    return searchProjects;
}

只要'|' 字符未出现在任何字段中...

于 2013-10-24T09:09:24.947 回答
0

您可以稍微更改代码并使用 Dictionary 对象,其中键是项目名称,值是您的对象。您的课程将变为:

public class Project : IDbProject
{
  public string Country { get; set; }
  public string Customer { get; set; }
  public DateTime UploadDate { get; set; }
  public DateTime CreateDate { get; set; }
  public string CreatedBy { get; set; }
}

然后,您将创建一个新的字典对象

Dictionary <string, Project> myProjects = new Dictionary<string, Project>();

然后你会填充它,将字符串设置为项目名称,当你想引用它时,你执行以下操作:

Project projectDetails = myProjects["projectName"];

显然将“projectName”更改为您需要的那个。

编辑

基于您可以做的开始(未经测试的代码)

Project projectDetails = myProjects.Where (m => m.Key.Contains ("projectName").Select (m => m.Value);
于 2013-10-24T09:01:13.877 回答