2008-11-05 20 views
56

Necesito buscar una cadena en la matriz de cadenas. No quiero usar ninguno para bucle en élCómo buscar una cadena en String array

string [] arr = {"One","Two","Three"}; 

string var = "One" 

Necesito comprobar si la variable var está presente en arr.

Respuesta

54

Todos los métodos mencionados anteriormente hacen bucles, ya sea interna o externamente, por lo que no es realmente importante cómo implementarlo.Aquí otro ejemplo de la búsqueda de todas las referencias de la cadena de destino

 string [] arr = {"One","Two","Three"}; 
     var target = "One"; 
     var results = Array.FindAll(arr, s => s.Equals(target)); 
+2

Array.Exists() es mejor, creo. –

104

Bueno, algo va a tener que mirar, y el bucle es más eficiente que la recursión (ya que la recursión final no está completamente implementada) ... así que si simplemente no desea hacer un bucle usted mismo, entonces de:

bool has = arr.Contains(var); // .NET 3.5 

o

bool has = Array.IndexOf(arr, var) >= 0; 

Para información: evitar nombres como var - esto es una palabra clave en C# 3.0.

21

¿Tiene que ser una cadena []? Una cadena de <String> le daría lo que necesita.

List<String> testing = new List<String>(); 
testing.Add("One"); 
testing.Add("Two"); 
testing.Add("Three"); 
testing.Add("Mouse"); 
bool inList = testing.Contains("Mouse"); 
4

Cada clase que implementa IList tiene un método Contains(Object value). Y también lo hace System.Array.

+0

en cuenta que con los 2.0 contenedores genéricos, esto es en ICollection ; La misma idea, aunque –

7
bool exists = arr.Contains("One"); 
4

Si la matriz está ordenada, puede usar BinarySearch. Esta es una operación O (log n), por lo que es más rápido que un bucle. Si necesita aplicar varias búsquedas y la velocidad es una preocupación, puede ordenarla (o una copia) antes de usarla.

1

En la primera toma, podría encontrar algo como esto (pero es un pseudo código y suponiendo que no se puede usar cualquier biblioteca .NET incorporada). Puede requerir un poco de ajuste y volver a pensar, ¿pero debería ser lo suficientemente bueno para una ventaja, tal vez?

int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex) 
    { 
    if currentIndex > stringMaxIndex 
     return (-stringMaxIndex-1); 
    else if var==arr[currentIndex] //or use any string comparison op or function 
     return 0; 
    else 
     return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ; 
    } 



    //calling code 
    int index = findString(var, arr, 0, getMaxIndex(arr)); 

    if index == -1 printOnScreen("Not found"); 
    else printOnScreen("Found on index: " + index); 
1

En C#, si se puede usar un ArrayList, puede utilizar el método, que devuelve un valor lógico Contiene:

if MyArrayList.Contains("One") 
+4

en .NET 2.0, siempre prefiere la Lista sobre ArrayList. Una lista haría lo mismo, pero con una mejor seguridad de tipo y más flexibilidad. –

3

Por qué la prohibición "no quiero utilizar cualquier bucle" ? Esa es la solución más obvia. Cuando se te presente la oportunidad de ser obvio, ¡tómalo!

Tenga en cuenta que las llamadas como arr.Contains(...) siguen yendo a bucle, simplemente no será usted quien haya escrito el bucle.

¿Ha considerado una representación alternativa más receptiva a la búsqueda?

  • Una buena implementación de conjunto funcionaría bien. (HashSet, TreeSet o el equivalente local).
  • Si puede estar seguro de que arr está ordenado, puede usar la búsqueda binaria (que debería recurrirse o repetirse, pero no tan a menudo como una búsqueda lineal directa).
8

creo que es mejor utilizar Array.Exists que Array.FindAll.

7

Es bastante simple. Yo siempre uso este código para buscar cadena a partir de una matriz de cadenas

string[] stringArray = { "text1", "text2", "text3", "text4" }; 
string value = "text3"; 
int pos = Array.IndexOf(stringArray, value); 
if (pos > -1) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 
2

Puede utilizar Find método del tipo de matriz. De .NET 3.5 y superior.

public static T Find<T>(
    T[] array, 
    Predicate<T> match 
) 

Aquí es algunos ejemplos:

// we search an array of strings for a name containing the letter “a”: 
static void Main() 
{ 
    string[] names = { "Rodney", "Jack", "Jill" }; 
    string match = Array.Find (names, ContainsA); 
    Console.WriteLine (match);  // Jack 
} 
static bool ContainsA (string name) { return name.Contains ("a"); } 

Aquí está el mismo código de corta duración con un método anónimo:

string[] names = { "Rodney", "Jack", "Jill" }; 
string match = Array.Find (names, delegate (string name) 
    { return name.Contains ("a"); }); // Jack 

Una expresión lambda acorta aún más:

string[] names = { "Rodney", "Jack", "Jill" }; 
string match = Array.Find (names, n => n.Contains ("a"));  // Jack 
1

Puedes verificar que el elemento exista rencia por

arr.Any(x => x == "One")