2013-02-18 29 views
2

名單我有,我想使用文本框採取搜索查詢(例如男子的黑色T恤),然後篩選基於此搜索查詢的對象列表的WinForms應用程序。過濾器由一個字符串數組

對象列表是訂單對象。每個訂單對象都有幾個屬性,如性別,大小,顏色等。

如果通過將空格字符拆分搜索查詢來獲取字符串數組,那麼搜索此字符串數組中的每個項目的最佳方法是什麼針對列表中每個對象的每個屬性,並返回匹配字符串數組中所有字符串的屬性?

例如,如果我搜索「黑孩子中」,我只想要回命令爲孩子和黑色中,所以我不希望只是黑色訂單或只是孩子訂購等

+2

你可以發佈你試過的代碼嗎? – 2013-02-18 13:55:04

回答

2

鑑於以下Order類:

class Order 
{ 
    public string Size {get; set;} 
    public string Gender {get; set;} 
    public string Colour {get; set;} 
    public string Type {get; set;} 

    // List of "searchable" properties 
    public IEnumerable<string> GetTags() 
    { 
     return new []{Size, Gender, Colour, Type}; 
    } 
} 

一個簡單的方法可能如下:

var list = new [] 
{ 
    new Order {Size = "large", Gender = "women", Colour = "red", Type = "tshirt"}, 
    new Order {Size = "large", Gender = "men", Colour = "black", Type = "tshirt"}, 
    new Order {Size = "medium", Gender = "kids", Colour = "black", Type = "tshirt"}, 
    new Order {Size = "medium", Gender = "kids", Colour = "black", Type = "shorts"}, 
    new Order {Size = "medium", Gender = "men", Colour = "black", Type = "tshirt"} 
}; 

var searchString = "kids black medium"; 
var searchValues = searchString.Split(new []{" "}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(); 

var result = from order in list 
      let tags = order.GetTags() 
      where searchValues.All(s => tags.Any(t => t == s)) 
      select order; 

result現在包含

enter image description here

你也可以使用IntersectHashSet比較搜索值/標籤,但沒有關於要求的進一步信息All/Any是一個足夠好的解決方案恕我直言。

+0

我可以親吻你,這工作很好。 – Spidey 2013-02-18 17:41:41

1

嘗試以下:

class Item 
{ 
    public bool Gender { get; set; } 
    public int Color { get; set; } 
    public string Type { get; set; } 

    public string[] GetKeyWords() 
    { 
     // Return properties as array of key words. 
     // You can cache the result for future use. 
     return default(string[]); 
    } 
} 

現在,如果你有一個項目和串(關鍵字)陣列的列表,你可以寫下面的查詢:

var matches = from item in items 
       let itemKeyWords = item.GetKeyWords() 
       where keyWords.All(k => itemKeyWords.Any(c => c == k)) 
       select item; 
相關問題