如何在字典键上“喜欢”?

时间:2012-01-25 18:19:39

标签: c# .net linq

如何找到“赞”来查找词典键?我现在正在做:

mydict.ContainsKey(keyName);

但是有些keyNames附加了一个附加的单词(用空格分隔),我想做一个“喜欢”或.StartsWith()。比较将如下所示:

"key1" == "key1"  //match
"key1" == "key1 someword" //partial match

我需要在两种情况下都匹配。

7 个答案:

答案 0 :(得分:20)

您可以使用LINQ执行此操作。

以下是两个例子:

bool anyStartsWith = mydict.Keys.Any(k => k.StartsWith("key1"))

bool anyContains = mydict.Keys.Any(k => k.Contains("key1"))

值得指出的是,这种方法的性能会比.ContainsKey方法差,但根据您的需要,性能不会显着。

答案 1 :(得分:2)

mydict.Keys.Any(k => k.StartsWith("key1"));

在枚举Keys时,您将失去字典的性能优势:

mydict.ContainsKey(someKey); // O(1)
mydict.Keys.Any(k => k.StartsWith("key1")); // O(n)

答案 2 :(得分:1)

如果您运行字符串的.Contains()方法而不是字典,那么您将得到您想要的内容。

var matchingKeys = mydict.Keys.Where(x => x.Contains("key1"));

答案 3 :(得分:0)

var keys = (from key mydict.keys where key.contains(keyName) select key).ToList();

答案 4 :(得分:0)

可以操纵字典的Keys成员来检查是否存在比平等更复杂的语义。它不一定是LINQ扩展方法检查,但这可能是最简单的。

答案 5 :(得分:0)

如果您想要密钥本身而不是真/假,您可以这样做:

string match = "key1";

    var matches = from k in mydict
                      where k.Key.Contains(match)
                      select new
                      {
                          k.Key
                      };

答案 6 :(得分:0)

为了匹配和检索“喜欢”键,您可以使用这些扩展名。

public static class Extensions
{
    public static bool HasKeyLike<T>(this Dictionary<string, T> collection, string value)
    {
        var keysLikeCount = collection.Keys.Count(x => x.ToLower().Contains(value.ToLower()));
        return keysLikeCount > 0;
    }

    public static List<string> GetKeysLike<T>(this Dictionary<string, T> collection, string value)
    {
        return collection.Keys.Select(x => x.ToLower().Contains(value.ToLower())).ToList();
    }
}