2012-01-25 9 views
9

¿Cómo puedo hacer un "Me gusta" para encontrar una clave de diccionario? Actualmente estoy haciendo:¿Cómo hacer "me gusta" en la clave del diccionario?

mydict.ContainsKey(keyName); 

Sin embargo, algunos nombres clave de tener una palabra adicional anexa (separadas por un espacio), me gustaría hacer un "me gusta" o .StartsWith(). Las comparaciones se verán así:

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

Tengo que coincidir en ambos casos.

+0

¿qué quieres que vuelva? ¿Los valores clave o si existen? – kd7

Respuesta

16

Puede usar LINQ para hacer esto.

He aquí dos ejemplos:

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

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

Vale la pena señalar que este método tendrá un peor rendimiento que el método .ContainsKey, pero dependiendo de sus necesidades, el impacto en el rendimiento no será notorio

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

al enumerar el Keys perderá los beneficios de rendimiento de un diccionario:

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

De hecho, uno se pregunta por qué OP está haciendo esto a un diccionario –

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

El miembro Claves del diccionario puede ser manipulado para verificar la presencia de la semántica más complicados que igualdad. No es necesario que sea una verificación del método de extensión LINQ, pero probablemente sea la más simple.

1

Si ejecuta el método .Contains() de la cadena y no del diccionario, obtendrá lo que desea.

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

si desea que los propias claves y no un verdadero/falso que puede hacer:

string match = "key1"; 

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

para la coincidencia y la recuperación de claves "como" usted podría utilizar estas extensiones.

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(); 
    } 
} 
Cuestiones relacionadas