2011-01-24 37 views
11

我想在Dictionary中搜索具有相似特徵的我的關鍵字。我想取鍵以「A」開頭或他們的第三個字母是「E」或他們的4RT字母不是「d」dictionary:搜索具有相似特徵的關鍵字符串

在SQL就可以編寫查詢「,其中(鍵如」一個 ')和(鍵不喜歡'd__')「我想要爲Dictionary提供此功能。任何算法建議你有?

謝謝!

回答

11

雖然這將是SQL相當於表掃描的,你可以使用LINQ或IEnumerable<T>擴展方法來搜索你的字典,它的鍵匹配模式的所有值:

擴展方法:

var values = dictionary.Where(pv => 
      pv.Key.StartsWith("A") || 
      (pv.Key.Length >= 3 && pv.Key[2] == 'e') || 
      pv.Key.Length < 4 || 
      pv.Key[3] != 'd').Select(pv => pv.Value); 

LIN問:

var values = (from pv in dictionary 
       where pv.Key.StartsWith("A") || 
        (pv.Key.Legnth >= 3 && pv.Key[2] == 'e') || 
        pv.Length < 4 || 
        pv.Key[3] != 'd' 
        select pv.Value); 

請注意,這兩個謂詞的最後一部分與你的「第四個字母不是」d「有關。我認爲這意味着長度爲三個字符(或更少)的字符串將與此匹配。如果您的意思是該字符串至少有四個字符,並且其第四個字符不是「d」,則更改應該很明顯。

請注意Dictionary類的主要(性能)好處是使用基於散列的密鑰查找,(在平均和最佳情況下)爲O(1)。使用這樣的線性搜索是O(n),所以類似這樣的事情通常會比普通的密鑰查找慢。

+0

你太棒了!感謝你的回答 ! – softwaremonster 2011-01-24 19:53:19

2

只需使用Linq:

var query = myDict.Where(x => x.Key.IndexOf('a') > -1 && x.Key.IndexOf("d_") == -1); 
+0

`選擇(X => X)`什麼都不做。雖然在實際的LINQ表達式中需要使用「select」語句,但在僅使用LINQ擴展方法的代碼中不需要該語句,除非實際執行轉換。另外,這與他所要求的邏輯不符,但我已經提出了,因爲它確實指出了實際的概念。 – 2011-01-24 19:47:11

+0

@亞當 - 感謝您指出。我的Linq-fu仍然需要開發...... – Oded 2011-01-24 20:03:25

10

可以訪問字典的鍵屬性,然後使用LINQ查詢來評估你的鑰匙:

var dictionary = new Dictionary<string,string>(); 

dictionary.Keys.Where(key => key.Contains("a")).ToList(); 
+3

我投票贊成,但我認爲重要的是我們實際上執行線性掃描來應用這個矛盾。 – 2011-01-24 19:40:40

2

您可以使用LINQ

像這樣的東西

myDic.Where(d=>d.Key.StartWith("a")).ToDictionary(d=>d.Key,d=>d.Value) 

或者

myDic.Where(d=>d.Key.Contains("b")).ToDictionary(d=>d.Key,d=>d.Value) 

或者

myDic.Where(d=>some other condition with d.Key).ToDictionary(d=>d.Key,d=>d.Value) 
1

這裏有一個小擴展我掀起了:

public static IList<string> KeysLikeAt(this Dictionary<string, object> dictionary, char letter, int index) 
{ 
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] == letter) 
     .Select(k => k.Key).ToList(); 
} 

public static IList<string> KeysNotLikeAt(this Dictionary<string, object> dictionary, char letter, int index) 
{ 
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] != letter) 
     .Select(k => k.Key).ToList(); 
} 

,你可以使用它像這樣:

IList<string> keysStartingWithA = dictionary.KeysLikeAt('a', 0); 

IList<string> keysNotStartingWithD = dictionary.KeysNotLikeAt('d', 0);