2012-01-20 21 views
16

tengo una cadenaCómo agregar una opción entre mayúsculas y minúsculas a Array.indexOf

string str="hello"; 

Ésta es mi serie

string[] myarr = new string[] {"good","Hello", "this" , "new"}; 

Necesito encontrar el índice de "hola" de la matriz (sin utilizar un bucle)

así que he utilizado

int index = Array.IndexOf(myarr, str); 

Esto devuelve -1, pero estoy esperando el resultado como 1.

Incluso he intentado con StringComparer.OrdinalIgnoreCase pero no sirvió.

Espero que alguien pueda ayudar. Gracias.

Respuesta

4

Ya está buscando índice. Intenta de esta manera.

Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) >=0); 
+0

en cuenta que esta búsquedas de respuesta para una _substring_ de la cadena de referencia en cada elemento de la matriz de entrada enumerado por 'Array.FindIndex()', debido al uso de 'System.String.IndexOf()'. Para hacer coincidir los elementos en su totalidad, use la sobrecarga análoga 'System.String.Equals()', como se muestra en las otras respuestas. – mklement0

1
var result = myarr.FindIndex(s => s.Equals(str, StringComparison.OrdinalIgnoreCase)); 
3

Array.IndexOf llama al método predeterminado "Igual" que distingue entre mayúsculas y minúsculas. Pruebe esto:

Array.FindIndex(myarr, t => t.Equals(str, StringComparison.InvariantCultureIgnoreCase)) 
0

tuve un problema similar, que necesitaba el índice del elemento, pero tenía que ser sensible a mayúsculas, miré alrededor de la web durante unos minutos y no encontró nada, por lo que acabo de escribir un pequeño método para obtener se hace, esto es lo que hice:

private static int getCaseInvariantIndex(List<string> ItemsList, string searchItem) 
{ 
    List<string> lowercaselist = new List<string>(); 

    foreach (string item in ItemsList) 
    { 
     lowercaselist.Add(item.ToLower()); 
    } 

    return lowercaselist.IndexOf(searchItem.ToLower()); 
} 

Añadir este código en el mismo archivo, y lo llaman así:

int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind); 

Espero que esto ayude, buena suerte!

28

Beaware !! La respuesta marcada podría tener algún problema, como

string array[] = {"hello", "hi", "bye" , "welcome" , "hell"} 

si se utiliza el mismo método que se describe en la respuesta para encontrar el índice de la palabra "infierno"

Int Indexofary = Array.FindIndex(array, t => t.IndexOf("hell", StringComparison.InvariantCultureIgnoreCase) >=0); 

obtendrá como resultado Indexofary = 0 en lugar de 4.

en lugar de que el uso

Array.FindIndex(array, t => t.Equals("hell", StringComparison.InvariantCultureIgnoreCase)); 

para obtener el resultado correcto.

Rrgards Bits

+7

¿por qué 'InvariantCultureIgnoreCase' en lugar de' OrdinalIgnoreCase'? – ManirajSS

0

1) si desea buscar sólo una vez y desea mantener matriz de origen, puede utilizar esto:

 public static void example1() 
     { 
      string[] myarr = { "good", "Hello", "this", "new" }; 
      var str = "new"; 
      var res= Array.FindIndex(myarr, x=>string.Equals(x, str, StringComparison.InvariantCultureIgnoreCase)); 
     } 

2) si va a buscar muchas veces será mejor utilizar esto:

public static void example1() 
    { 
     string[] myarr = {"good", "Hello", "this", "new"}; 
     var str = "new"; 
     var res = Array.IndexOf(Array.ConvertAll(myarr, ToStringlowerCase), str.ToLowerInvariant()); 
    } 

3) la respuesta anterior es incorrecta:

string array[] = {"hello", "hi", "bye" , "welcome" , "hell"} 
Int Indexofary = Array.FindIndex(array, t => t.IndexOf("hell", StringComparison.InvariantCultureIgnoreCase) >=0); 

no funcionará en absoluto, ya que no busca en la cadena, pero subcadena.

Algoritmo itera las palabras en matriz, cuando la 1ra palabra "hello" es tomada, el algoritmo intenta encontrar el índice de 'infierno' y este índice es 1. 1 es> luego 0 y el algoritmo terminará sin ir a otras palabras.

Si no desea buscar subcadenas pero desea buscar cadenas, algorythm debe corregirse. Este algoritmo puede corregirse agregando la comprobación de que la subcadena se inicia desde el 1er carácter t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0 y la longitud de las palabras es igual a str.Length == t.Length. Fijo:

 public static int example3() 
    { 
     string[] myarr = { "hHello", "hi", "bye", "welcome", "hell" }; 
     var str = "hell"; 
     return Array.FindIndex(myarr, t => t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0 && str.Length == t.Length); 
    } 
0

Desde Array.IndexOf es genérica, tiene sentido hacer una función de extensión genérica:

public static int IndexOf<T>(this T[] source, T value) 
{ 
    return IndexOf<T>(source, value, StringComparison.InvariantCultureIgnoreCase); 
} 

public static int IndexOf<T>(this T[] source, T value, StringComparison stringComparison) 
{ 
    if (typeof(T) == typeof(string)) 
    return Array.FindIndex(source, m => m.ToString().Equals(value.ToString(), stringComparison)); 
    else 
    return Array.IndexOf(source, value); 
} 
Cuestiones relacionadas