2012-01-25 7 views
9

Jak mogę "polubić", aby znaleźć klucz słownika? Jestem obecnie robi:Jak zrobić "like" na klawiszu słownikowym?

mydict.ContainsKey(keyName); 

Ale niektóre nazwy kluczy mają dodatkowe słowo dołączany (oddzielone spacją), chciałbym zrobić „jak” lub .StartsWith(). Porównywarki będą wyglądać tak:

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

Muszę dopasować w obu przypadkach.

+0

czego chcesz zwrócić? Kluczowe wartości lub czy istnieją? – kd7

Odpowiedz

16

Możesz użyć LINQ, aby to zrobić.

Oto dwa przykłady:

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

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

Warto podkreślić, że metoda ta będzie miała gorsze wyniki niż metoda .ContainsKey, ale w zależności od potrzeb, hit wydajność nie będzie zauważalny.

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

Podczas wyliczania nad Keys stracisz korzyści wydajnościowe słownika:

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

Rzeczywiście, można się zastanawiać, dlaczego OP robi to ze słownikiem –

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

Człon Klawisze słownika można manipulować w celu sprawdzenia obecności z bardziej skomplikowanych semantyki niż równość. Nie musi to być kontrola metody rozszerzenia LINQ, ale najprawdopodobniej jest to najprostsza metoda.

1

Po uruchomieniu metody .Contains() ciąg, a nie słownik, otrzymasz to, co chcesz.

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

Jeśli chcesz same klucze i nie prawda/fałsz można zrobić:

string match = "key1"; 

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

dopasowywania i odzyskiwanie kluczy „like” można użyć tych rozszerzeń.

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(); 
    } 
} 
Powiązane problemy