2016-12-25 158 views
0

我有一个数据视图,它由使用字符串列表的对象填充。我想通过在文本框中输入搜索词来选择合适的条目。如何过滤使用字符串列表的字符串列表的列表

我的对象:

class my_object 
{ 
    List<string> column1 = new List<string>(); 
    List<string> column2 = new List<string>(); 
    List<string> column3 = new List<string>(); 
    List<string> column4 = new List<string>(); 
} 

我的条目数据视图:

List<my_object> entries = new List<my_object>(); 

我的目的是过滤像在Windows资源管理器但不同的搜索功能中的条目,我想包括四列而不仅仅是具有文件名的列。 有没有可能做到这一点?

我曾尝试:

internal static List<my_object> SearchObject(this List<my_object> Source, List<string> SearchWords) 
{ 
    List<my_object> results = new List<my_object>(); 

    foreach (my_object m in Source) 
    { 
     foreach(string s in SearchWords) 
     { 
      // Filter Column 1 
      foreach(string c1 in m.column1) 
      { 
       if(c1.IndexOf(s) != -1) 
       { 
        results.Add(m); 
        break; 
       } 
      } 
     } 
    } 

    return results; 

    // Problem: 
    // This function only filters the first column. 
    // If I want to filter the next column, I have to break all 'foreach' blocks 
    // except the '(my_object m in Source)' block... 

    // It the 'break' would work for more the one loop, this method would work... 
} 

希望你能帮助我。

回答

0

为什么你不能使用Contains()方法类似

foreach (my_object m in Source) 
{ 
    foreach(string s in SearchWords) 
    { 
     If(m.column1.Contains(s) || m.column2.Contains(s) || m.column3.Contains(s)) 
     { 
      results.Add(m); 
      break; 
     }   
    } 
} 
+0

感谢您的快速回答。 –

+0

不幸的是,这种解决方案只适用于整个单词... –

0

您可以联盟在一个列表中的所有子表的,然后应用任何扩展的单词列表搜索

foreach (my_object m in Source) 
{ 
    List<string> allStrings = m.Column1.Union(m.Column2) 
             .Union(m.Column3) 
             .Union(m.Column4) 
             .ToList(); 
    bool exists = SearchWords.All(x => allStrings.IndexOf(x) != -1));  
    if(exists) 
     results.Add(m); 
} 

但是我会针对更传统的解决方案测试性能

+0

感谢您的快速回答。 它的工作速度非常快,但不幸的是它只适用于整个单词,并选择单词x或单词y为真的项目。我想只有单词x和单词y是真的... –

+0

那么,对于第一个问题,我们可以用IndexOf替换Contains,第二个问题不是很清楚。你能解释一下你对x字和y字有什么意义吗? – Steve

+0

好的,indexof是清楚的,并与字x和y我的意思是搜索字 –

0

这样做的一种方法是重构您的类以允许搜索。这里有一个使用索引的例子:

class my_object 
{ 
    class Coordinates 
    { 
     public int _column = 0; 
     public int _row = 0; 
     public Coordinates(int row, int column) 
     { 
      _column = column; 
      _row = row; 
     } 
    } 
    List<List<string>> columns = new List<List<string>>(4); 
    Dictionary<string, List<Coordinates>> searchIndex = new Dictionary<string, List<Coordinates>>(); 
    public my_object() 
    { 
     for (int i = 0; i < columns.Count; i++) 
     { 
      columns[i] = new List<string>(); 
     } 
    } 
    //This will create entries for each consecutive substring in each word that you add. 
    public void AddWord(string word, int column) 
    { 
     for (int i = 0; i < word.Length; i++) 
     { 
      int limit = word.Length - i; 
      for (int j = 1; j < limit; j++) 
      { 
       string temp = word.Substring(i, j); 
       if (!searchIndex.ContainsKey(temp)) 
       { 
        searchIndex.Add(temp, new List<Coordinates>()); 
       } 
       searchIndex[temp].Add(new Coordinates(columns.Count, column)); 
      } 

     } 
     columns[column].Add(word); 
    } 
    //This will return a list of list of strings that contain the search term. 
    public List<List<string>> Find(string term) 
    { 
     List<List<string>> outVal = new List<List<string>>(4); 
     if(searchIndex.ContainsKey(term)) 
     { 
      foreach(Coordinates c in searchIndex[term]) 
      { 
       outVal[c._column].Add(columns[c._column][c._row]); 
      } 
     } 
     return outVal; 
    } 
} 
相关问题