字典通配符搜索

本文关键字:搜索 通配符 字典 | 更新日期: 2023-09-27 18:09:37

我试图创建一个字符串搜索通配符和字典类

Dictionary<string, Node> Nodes = new Dictionary<string, Node>();
public bool ResponceSearch(string search) {
     if (Nodes.ContainsKey(search)) {
         label1.Text = Nodes[search].GetResult();
         return true;
     }
}

搜索字符串,如

What is that

和字典包含键,如

Who is *
What is *

所以搜索根据"what is that"搜索字符串找到"what is *"。

字典通配符搜索

如果您可以将字典键更改为合适的正则表达式,如:

@"Who is 'w+"
@"What is 'w+"

那么这个问题就简单多了:

public bool ResponceSearch(string search) {
     var node = 
         (from p in Nodes
          where Regex.Matches(p.Key, search)
          select p.Value)
         .FirstOrDefault();
     if (node != null) {
         label1.Text = node.GetResult();
         return true;
     }
}

您甚至可以为此编写扩展方法。例如:

public static bool ContainsKeyPattern<T>(this Dictionary<string, T> nodes, string search) 
{
     return nodes.Keys.Any(k => Regex.Matches(k, search));
}
public static T GetItemByKeyPattern<T>(this Dictionary<string, T> dict, string search) 
{
     return
         (from p in dict
          where Regex.Matches(p.Key, search)
          select p.Value)
         .First();
}

您也可以尝试以下操作。看起来简单多了。您可以使用的另一个方法是string.EndsWith():

return Nodes.Any(item => item.Key.StartsWith("Who is"));
return Nodes.Any(item => item.Key.StartsWith("What is"));

或者

KeyValuePair<string, object> viewDto = ctx.ActionParameters.FirstOrDefault(item => item.Key.ToLower().EndsWith("Who is"));
KeyValuePair<string, object> viewDto = ctx.ActionParameters.FirstOrDefault(item => item.Key.ToLower().EndsWith("What is"));