¿La cadena está en matriz?

¿Cuál sería la mejor manera de buscar en una string[] para ver si contiene un elemento? Esta fue mi primera oportunidad. Pero tal vez hay algo que estoy pasando por alto. El tamaño de la matriz no será mayor a 200 elementos.

 bool isStringInArray(string[] strArray, string key) { for (int i = 0; i <= strArray.Length - 1; i++) if (strArray[i].ToString() == key) return true; return false; } 

Solo use el método Contiene () ya incorporado:

 using System.Linq; //... string[] array = { "foo", "bar" }; if (array.Contains("foo")) { //... } 

Sé que esto es antiguo, pero quería que los nuevos lectores supieran que hay un nuevo método para hacerlo utilizando métodos generics y de extensión.

Puedes leer mi publicación en el blog para ver más información sobre cómo hacer esto, pero la idea principal es esta:

Al agregar este método de extensión a su código:

 public static bool IsIn(this T source, params T[] values) { return values.Contains(source); } 

puede realizar su búsqueda de esta manera:

 string myStr = "str3"; bool found = myStr.IsIn("str1", "str2", "str3", "str4"); 

Funciona en cualquier tipo (siempre que crees un buen método igual). Cualquier tipo de valor para seguro.

Simplemente está buscando la función Array.Exists (o el método de extensión Contains si usa .NET 3.5, que es un poco más conveniente).

Linq (para s & g’s):

 var test = "This is the string I'm looking for"; var found = strArray.Any(x=>x == test); 

o, dependiendo de los requisitos

 var found = strArray.Any( x=>x.Equals(test, StringComparison.OrdinalIgnoreCase)); 

¿La matriz está ordenada? Si es así, podrías hacer una búsqueda binaria . Aquí está la implementación de .NET también. Si la matriz está ordenada, una búsqueda binaria mejorará el rendimiento con respecto a cualquier solución iterativa.

Las matrices son, en general, una estructura de datos deficiente para usar si desea preguntar si un objeto en particular está en la colección o no.

Si va a ejecutar esta búsqueda con frecuencia, podría valer la pena usar un Dictionary lugar de una matriz. Las búsquedas en un diccionario son O (1) (tiempo constante), mientras que la búsqueda a través de la matriz es O (N) (toma un tiempo proporcional a la longitud de la matriz).

Incluso si la matriz tiene solo 200 elementos como máximo, si realiza muchas de estas búsquedas, es probable que el diccionario sea más rápido.

También puede usar LINQ para iterar sobre la matriz. o puede usar el método Find que lleva a un delegado a buscarlo. Sin embargo, creo que el método de búsqueda es un poco más caro que simplemente recorrerlo.

Como se mencionó muchas veces en el hilo anterior, depende del marco en uso. .Net Framework 3 y superior tiene los métodos .Contains () o Exists () para matrices. Para otros marcos a continuación, puede hacer el siguiente truco en lugar de hacer un bucle a través de la matriz …

 ((IList)"Your String Array Here").Contains("Your Search String Here") 

No estoy seguro de la eficiencia … Dave

Esto es más rápido que iterar manualmente a través de la matriz:

 static bool isStringInArray(string[] strArray, string key) { if (strArray.Contains(key)) return true; return false; } 

Si no quiere o simplemente no puede usar Linq, también puede usar Array.Exists(...); estático Array.Exists(...); función:

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

 var arr = new string[]{"bird","foo","cat","dog"}; var catInside = Array.Exists( arr, // your Array (s)=>{ return s == "cat"; } // the Predicate ); 

Cuando el predicado devuelve verdadero una vez que catInside será verdadero también.