2012-01-20 10 views
16

ho una stringa diCome aggiungere un'opzione case-insensitive di Array.indexOf

string str="hello"; 

Questa è la mia serie

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

ho bisogno di trovare l'indice di "ciao" dalla matrice (senza utilizzare un loop)

Così ho usato

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

Restituisce -1, ma mi aspetto risultato come 1.

Ho anche provato con StringComparer.OrdinalIgnoreCase ma senza risultato.

Spero che qualcuno possa aiutare. Grazie.

risposta

4

Dato che stai cercando l'indice. Prova in questo modo.

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

notare che questa ricerca di risposta per un _substring_ della stringa di riferimento in ciascun elemento della matrice di input elencate di 'Array.FindIndex()', dovuto all'utilizzo di 'System.String.IndexOf()'. Per abbinare completamente gli elementi, utilizzare l'analogo sovraccarico'System.String.Equals() ', come mostrato nelle altre risposte. – mklement0

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

Array.IndexOf chiama il metodo "Equals" predefinito che fa distinzione tra maiuscole e minuscole. Prova questo:

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

ho avuto un problema simile, avevo bisogno l'indice della voce, ma doveva essere case insensitive, mi sono guardato intorno al web per un paio di minuti e trovato nulla, così ho scritto un piccolo metodo per ottenere it done, qui è quello che ho fatto:

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

Aggiungere questo codice lo stesso file, e chiamare in questo modo:

int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind); 

Spero che questo aiuti, buona fortuna!

28

Beaware !! La risposta contrassegnato potrebbe avere qualche problema, come

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

se si utilizza lo stesso metodo descritto nella risposta per trovare l'indice della parola "inferno"

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

otterrete provocare Indexofary = 0 invece di 4.

invece di che l'uso

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

per ottenere il corretto risultato.

Rrgards Bits

+7

perché "InvariantCultureIgnoreCase' invece di" OrdinalIgnoreCase'? – ManirajSS

0

1) se si desidera effettuare la ricerca solo una volta e si desidera mantenere matrice di origine, è possibile utilizzare questo:

 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) se si cercherà più volte sarà meglio usare questo:

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 risposta di cui sopra non è corretto:

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

non funziona affatto, perché cerca non la stringa, ma sottostringa.

Algoritmo itera le parole in array, quando 1a parola "ciao" eseguita, l'algoritmo prova a trovare l'indice di "inferno" e questo indice è 1. 1 è> quindi 0 e l'algoritmo sarà terminato senza passare ad altre parole.

Se non si desidera cercare sottostringhe ma si desidera cercare le stringhe, è necessario correggere l'algoritmo. Questo algoritmo può essere risolto aggiungendo il controllo che la sottostringa parte dal 1 ° char t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0 e la lunghezza delle parole è uguale a str.Length == t.Length. Fisso:

 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

Da Array.IndexOf è generico, ha senso effettuare una funzione di estensione generica:

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); 
} 
Problemi correlati