字典:搜索具有相似功能的键字符串

时间:2011-01-24 19:35:17

标签: c# dictionary

我想用类似的功能在Dictionary中搜索我的键。我想把钥匙以“a”开头,或者他们的第3个字母是“e”或者他们的4rt字母不是“d”

在sql中可以编写查询“where(像 a '这样的键)和(键不像'd __ ')”我希望有这个功能为词典。您有任何算法建议吗?

谢谢!

5 个答案:

答案 0 :(得分:13)

虽然这将是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);

LINQ:

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);

请注意,这两个谓词的最后一部分与你的#34相关;第四个字母不是&#34; d&#34;。我认为这意味着长度为三个字符(或更少)的字符串将与此匹配。如果你的意思是字符串至少有四个字符,而第四个字符不是&#34; d&#34;,则更改应该是显而易见的。

请注意Dictionary类的主要(性能)优势是使用基于散列的密钥查找,(在平均和最佳情况下)是O(1)。使用像这样的线性搜索是O(n),所以这样的东西通常比普通的密钥查找慢。

答案 1 :(得分:12)

您可以访问Dictionary的Keys属性,然后使用Linq查询来评估您的密钥:

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

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

答案 2 :(得分:3)

只需使用Linq:

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

答案 3 :(得分:3)

您可以使用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)

答案 4 :(得分: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);