2011-06-17 42 views
8

嗨,我想創建基於使用謂詞表達式搜索字符串列表。如何創建謂詞動態

我有一個類型的產品列表中包含不同的名稱。

List<products> list1 = new List<products>(); 

     list1.Add(new products("sowmya")); 
     list1.Add(new products("Jane")); 
     list1.Add(new products("John")); 
     list1.Add(new products("kumar")); 
     list1.Add(new products("ramya")); 
     listBox1.ItemsSource = list1; 

現在我想過濾基於用戶輸入的內容。用戶將輸入n的字符串'+'作爲分隔符。接收字符串後,我會通過他們的謂詞對象這樣

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     List<products> list2 = new List<products>(); 
     Expression<Func<products, bool>> predicate = PredicateBuilder.True<products>(); 
     if (e.Key == Key.Enter) 
     { 
      string Searchstring = textBox1.Text.ToString().Trim(); 
      string[] separator = new string[] { "+" }; 
      string[] SearchItems=Searchstring.Split(separator,StringSplitOptions.None); 
      foreach (string str in SearchItems) 
      { 
       string temp = str; 
       predicate =p => p.Name.Contains(temp.ToLower());     
      } 

      list2 = list1.AsQueryable().Where(predicate).ToList(); 
      listBox1.ItemsSource = list2; 
     } 
    } 

如果我輸入多個字符串(sowmya +珍+約翰)的只給最後一個字符串(約翰)的結果,但我想的列表所有匹配的字符串

請回答這個問題,因爲我想這一點,但我無法得到的結果。

請做一些幫助表示感謝。

+0

dup:http://stackoverflow.com/questions/845059/how-do-i-dynamically-create-an-expressionfuncmyclass-bool-predicate – 2011-06-17 09:33:05

回答

12

初始化謂詞爲假

Expression<Func<products, bool>> predicate = PredicateBuilder.False<products>(); 

您需要的謂詞使用Or

foreach (string str in SearchItems) 
{ 
    string temp = str; 
    predicate = predicate.Or(p => p.NameToLower().Contains(temp.ToLower()));     
} 
+0

如果我使用和結合謂詞其給予所有列表項但不是匹配的字符串結果 – Sowmya 2011-06-17 10:48:22

+0

@Sowmya更新了我的答案。你需要在謂詞內部使用'temp'而不是'str' – Eranga 2011-06-17 11:41:03

+0

嘿Eranga非常感謝你的工作。真的,你幫了我 – Sowmya 2011-06-17 12:11:23

1

由於我不知道謂詞實例都有一個和方法相結合,我建議你使用這個代碼:

var list = list1.AsQueryable(); 
foreach (string str in SearchItems) 
{ 
    list = list.Where(p => p.Name.ToLower().Contains(str.ToLower())); 
} 
listBox1.ItemsSource = list.ToList(); 
+0

如果我使用此代碼它只給出一個字符串結果,但如果我輸入兩個字符串它不給任何結果。請找到解決方案。我需要它。 – Sowmya 2011-06-17 10:24:25

+0

這可能是因爲我剛添加的第一個'.ToLower()'。如果不能確保你的'Name'財產確實包含這兩個字符串您搜索 – 2011-06-17 10:28:34

+0

同一問題再次給最後一個字符串結果only.Ya我敢肯定,「名稱」屬性包含兩種,如果你有 – Sowmya 2011-06-17 11:04:43

2

您不必在此處構建謂詞。你可以嘗試這樣的事情

List<products> list1 = new List<products>(); 

list1.Add(new products("sowmya")); 
list1.Add(new products("Jane")); 
list1.Add(new products("John")); 
list1.Add(new products("kumar")); 
list1.Add(new products("ramya")); 

string input = "aaa+kuma+ram"; 
List<string> searchStrings = 
    input.Split(new string[] { "+" }, StringSplitOptions.None) 
    .Select(s => s.ToLower()) 
    .ToList(); 

List<products> list2 = (
    from p in list1 
    where searchStrings.Any(s => p.Name.Contains(s)) 
    select p).ToList(); 

list2將包含「kumar」和「ramya」。

+0

感謝u和工作的,並且也在努力我知道,但我需要通過使用謂詞來構建它只是請大家幫我 – Sowmya 2011-06-17 11:14:22

+0

@Sowmya那麼你應該嘗試什麼Eranga建議。 – Gebb 2011-06-17 11:54:27