2012-01-25 11 views
9

Come posso fare un "mi piace" per trovare un tasto del dizionario? Attualmente sto facendo:Come fare "mi piace" sulla chiave del dizionario?

mydict.ContainsKey(keyName); 

Ma alcuni nomi chiave di avere una parola aggiuntiva aggiunto (separati da uno spazio), mi piacerebbe fare un "like" o .StartsWith(). Il confronto sarà simile a questo:

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

Devo corrispondere in entrambi i casi.

+0

cosa vuoi restituire? I valori chiave o se esistono? – kd7

risposta

16

È possibile utilizzare LINQ per eseguire questa operazione.

Ecco due esempi:

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

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

Vale la pena di sottolineare che questo metodo avrà performance peggiore rispetto al metodo .ContainsKey, ma a seconda delle esigenze, il calo di prestazioni non sarà notabile.

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

durante l'enumerazione il Keys si perderanno i vantaggi prestazionali di un dizionario:

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

In effetti, ci si chiede perché l'OP stia facendo questo a un dizionario –

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

Il membro chiavi del dizionario può essere manipolato per verificare la presenza con la semantica più complicato di uguaglianza. Non è necessario un controllo del metodo di estensione LINQ, ma probabilmente è il più semplice.

1

Se si esegue il metodo .Contains() della stringa e non il dizionario si otterrà ciò che si desidera.

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

Se si desidera che i tasti stessi e non un vero/falso si può fare:

string match = "key1"; 

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

Per l'adattamento e recupero delle chiavi "come" si potrebbe usare queste estensioni.

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(); 
    } 
} 
Problemi correlati