2013-04-05 161 views
2

我有一個字符串列表。我需要能夠以類似Google查詢的方式來過濾它們。用邏輯過濾字符串列表?

例:NOT water OR (ice AND "fruit juice")

含義沒有字水或返回,可以有水,如果他們有冰和「果汁」的字符串返回字符串。

.NET中是否有一種機制可以允許用戶以這種形式(例如在文本框中)編寫查詢,並給出一個List或IEnumerable字符串,並返回包含這個的字符串。

LINQ可以做這樣的事情嗎?

我知道我可以用LINQ做到這一點,我更關心的是將任意字符串解析爲可執行表達式。

+0

我知道我可以用LINQ來做到這一點,我更關心的是將任意字符串解析爲可執行表達式。 – jmasterx 2013-04-05 12:36:46

+0

我很驚訝.NET沒有任何標記解析。 – jmasterx 2013-04-05 12:43:28

回答

3

沒有什麼內置的。

你需要自己解析這樣一個字符串,並可能使用Expression類建立從中篩選可執行的表達。

1

對於此查詢:含義返回字符串,如果他們有冰塊和「果汁」,則返回的字符串不包含水或返回可以有水的字符串。

嘗試這樣的事情,如果你要使用LINQ

yourList.Where(i => !i.Contains("water") || 
       (i.Contains("water") && 
       i.Contains("ice") && 
       i.Contains("fruit juice"))); 
+0

你在開始時錯過了'NOT'。這對任何其他input_ – Oded 2013-04-05 12:35:02

+0

@Oded都沒有幫助,謝謝。 – 2013-04-05 12:39:29

0

在LINQ:list.Where(item => !item.Contains("water") || (item.Contains("ice") && item.Contains("fruit juice")))

+0

而當用戶輸入其他東西? – Oded 2013-04-05 12:37:17

+0

@Oded是的,我沒有意識到問題是關於解析來自用戶的查詢。 – 2013-04-05 12:38:11

0

我想使用一個代碼示例,因爲如你所說,這是我們更不能回答你邏輯。

什麼,我會在這種情況下做的,是有預先定義的條件(地方保存),將包含你與他們的「編碼轉換」等一起需要的所有條件:

  • 而不是
  • 和或
  • 等...

你將在運行時做什麼是將這些條件/標準轉換成sql或linq或任何你需要傳遞給它的語言。

0

你可以嘗試使用DataTable.Select方法:

public static class ExpressionExtensions { 

    public static IEnumerable<T> Select<T>(this IEnumerable<T> self, string expression) { 
    var table = new DataTable(); 
    table.Columns.Add("Value", typeof(T)); 

    foreach (var item in self) { 
     var row = table.NewRow(); 
     row["Value"] = item; 
     table.Rows.Add(item); 
    } 

    return table.Select(expression).Select(row => (T)row["Value"]); 
    } 

} 

但你必須遵循它的格式來創建你的表達:

var filtered = strings.Select("NOT Value LIKE '*water*' OR (Value LIKE '*ice*' AND Value LIKE '*fruit juice*')"); 

還要注意的是,在這種情況下,由於串fruit juice已經包含字符串ice,第二個條件是多餘的。你必須找到表達「單詞」而不是「子串」的方法。

最後,你可能會更好地自己實現解析邏輯。