我想在Dictionary中搜索具有相似特徵的我的關鍵字。我想取鍵以「A」開頭或他們的第三個字母是「E」或他們的4RT字母不是「d」dictionary:搜索具有相似特徵的關鍵字符串
在SQL就可以編寫查詢「,其中(鍵如」一個 ')和(鍵不喜歡'd__')「我想要爲Dictionary提供此功能。任何算法建議你有?
謝謝!
我想在Dictionary中搜索具有相似特徵的我的關鍵字。我想取鍵以「A」開頭或他們的第三個字母是「E」或他們的4RT字母不是「d」dictionary:搜索具有相似特徵的關鍵字符串
在SQL就可以編寫查詢「,其中(鍵如」一個 ')和(鍵不喜歡'd__')「我想要爲Dictionary提供此功能。任何算法建議你有?
謝謝!
雖然這將是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),所以類似這樣的事情通常會比普通的密鑰查找慢。
只需使用Linq:
var query = myDict.Where(x => x.Key.IndexOf('a') > -1 && x.Key.IndexOf("d_") == -1);
`選擇(X => X)`什麼都不做。雖然在實際的LINQ表達式中需要使用「select」語句,但在僅使用LINQ擴展方法的代碼中不需要該語句,除非實際執行轉換。另外,這與他所要求的邏輯不符,但我已經提出了,因爲它確實指出了實際的概念。 – 2011-01-24 19:47:11
@亞當 - 感謝您指出。我的Linq-fu仍然需要開發...... – Oded 2011-01-24 20:03:25
可以訪問字典的鍵屬性,然後使用LINQ查詢來評估你的鑰匙:
var dictionary = new Dictionary<string,string>();
dictionary.Keys.Where(key => key.Contains("a")).ToList();
我投票贊成,但我認爲重要的是我們實際上執行線性掃描來應用這個矛盾。 – 2011-01-24 19:40:40
您可以使用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)
這裏有一個小擴展我掀起了:
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);
你太棒了!感謝你的回答 ! – softwaremonster 2011-01-24 19:53:19