2009-02-01 9 views
84

¿Cuál sería la mejor manera de buscar en un 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.¿Hay cadena en la matriz?

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

Respuesta

169

sólo tiene que utilizar el built-in ya contiene() Método:

using System.Linq; 

//... 

string[] array = { "foo", "bar" }; 
if (array.Contains("foo")) { 
    //... 
} 
+0

Por alguna razón, cuando primero busqué el método no pude encontrarlo ... gracias. – Brad

+4

@Brad: Eso es porque es un método de extensión proveniente de Enumerable. – AnthonyWJones

+47

Debe incluir System.Linq para que esto funcione. –

1

También puede utilizar 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.

+0

El método Find será algorítmicamente idéntico al método de" bucle ". Cualquier gasto extra será algo de creación de objetos y tal vez una o dos capas de indirección, pero si te preocupa optimizarlos a expensas de la legibilidad, te estás preocupando por cosas equivocadas. –

6

¿Está ordenada la matriz? Si es así, podría hacer un binary search. Aquí está the .NET implementation as well. Si la matriz está ordenada, una búsqueda binaria mejorará el rendimiento sobre cualquier solución iterativa.

+0

Bueno, O (N) a O (log n) ;-p –

+0

Quité mi hiperbólica "exponencialmente" :) –

12

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

+3

Aquí está un ejemplo de trabajo para .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor)) – Fueled

6

Linq (por s & de g):

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)); 
1

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

static bool isStringInArray(string[] strArray, string key) 
    { 

     if (strArray.Contains(key)) 
      return true; 
     return false; 
    } 
+1

Y eso es más rápido ¿cómo? – senfo

+0

usando LINQ es más rápido que iterar a través de la cadena como se hizo en el ejemplo. strArray.Contains (key) es todo lo que realmente es necesario –

+2

Detrás de escena, strArray.Contains (key) simplemente va a recorrer la matriz de todos modos ... no hay magia involucrada que te deje sin O (n) buscar. –

2

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

Si va a ejecutar esta búsqueda con frecuencia, podría valer la pena utilizar un Dictionary<string, something> en 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.

+1

la búsqueda binaria es O (log n); el diccionario ** subtiende ** a O (1) - pero hay un montón de sobrecarga; para búsqueda de tamaño pequeño a mediano, lineal o búsqueda binaria puede superar. –

1

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 cuadros siguientes, puede hacer el siguiente truco en lugar de bucle a través de gama ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here") 

No muy seguro en la eficiencia ... de Dave

20

Sé que esto es viejo, pero yo quería que el nuevo lectores para saber que hay un nuevo método para hacer esto usando genéricos y métodos de extensión.

Puede leer mi blog post para ver más información acerca de cómo hacer esto, pero la idea principal es la siguiente:

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

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

que se pueden realizar su buscar como este:

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

Funciona en cualquier tipo (siempre y cuando cree un buen método de igualdad). Cualquier tipo de valor para seguro.

+0

Tengo algo como esto 'var xxx = csvData.Rows [0] .ItemArray [0] .IsIn (" .00 "," 0.0 "," .25 "," 0.5 "," .5 ",". 50 "," .75 ");' lo que quiero hacer es mirar a través de quién datatable en la primera columna para ver si los valores no terminan en cualquiera de las siguientes cadenas ... si no lo hacen, entonces quiero devuelve una cadena que dice que le falta un valor '.00' por ejemplo usando tu ejemplo. Parece que no puedo hacer que funcione. Es un poco más complicado porque no quiero devolver un bool. Altere tu método para devolver una cadena. pero todavía no funciona ninguna sugerencia – MethodMan

+0

Esto parece plantearse mejor como una pregunta en el sitio. Siga adelante y haga referencia a esta respuesta si es necesario. –

+0

De hecho, pude encontrar una manera increíble de hacer lo que quería hacer Escribí algo que verificaría si los valores de una cadena dentro de un bucle for para Datatables ItemArray terminan con cualquiera de los siguientes valores que tenía en mi cadena 'bool estático público EndWithValue (este valor de cadena, valores de IEnumerable ) { return values.Any (item => value.EndsWith (item)); } ' – MethodMan

Cuestiones relacionadas