2013-04-17 135 views
2

我試圖創建一個帶有通配符字符串搜索和詞典類詞典模糊搜索

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 * 

因此,搜索根據「什麼是」搜索字符串找到「什麼是*」。

+0

所以,你到底要達到什麼樣的? – mattytommo

+0

你不打算用字典進行這項工作。 –

+0

不用字典。 – I4V

回答

4

如果你可以改變你的字典鍵是正確的regular expressions,如:

@"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(); 
} 
+1

如果迭代所有的鍵,那麼字典的用法是什麼?只需保存鍵/值對? – I4V

+0

@ I4V好吧,你不會迭代所有的鍵,直到你找到一個匹配的。但是,沒有理由這個*有*是字典。 –

+1

@ p.s.w.g「那麼你不會迭代所有的鍵」 - 它是期望的線性運行時。不妨使用'List >'。 –

1

您還可以嘗試關注。看起來更簡單。您可以使用另一種方法是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"));