3

我正在尝试使用通配符和 Dictionary 类创建字符串搜索

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 *”。

4

2 回答 2

4

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

@"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();
}
于 2013-04-17T21:27:01.713 回答
3

您也可以尝试关注。看起来简单多了。您可以使用的另一种方法是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"));
于 2013-05-20T16:41:32.137 回答