2012-01-20 13 views
16

Mam ciągJak dodać opcję uwzględniania wielkości liter do Array.IndexOf

string str="hello"; 

To jest mój tablicy

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

Muszę znaleźć indeks „cześć” z tablicy (bez użycia pętli)

więc mam wykorzystywane

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

Zwraca -1, ale oczekuję wyniku jako 1.

Próbowałem nawet z StringComparer.OrdinalIgnoreCase, ale bezskutecznie.

Mam nadzieję, że ktoś może pomóc. Dzięki.

Odpowiedz

4

Ponieważ szukasz indeksu. Spróbuj w ten sposób.

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

pamiętać, że ta odpowiedź wyszukuje _substring_ łańcucha odniesienia w każdym elemencie tablicy wejściowej wyliczone przez 'Array.FindIndex()', z powodu użycia 'System.String.IndexOf()'. Aby w pełni dopasować elementy, użyj przeciążenia analogicznego 'System.String.Equals()', jak pokazano w innych odpowiedziach. – mklement0

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

Array.IndexOf wywołuje domyślną metodę "Równa się", w której rozróżniana jest wielkość liter. Wypróbuj to:

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

miałem podobny problem, musiałem indeks pozycji, ale to musiał być przypadek niewrażliwe, rozejrzałem się w internecie na kilka minut i nic nie znalazłem, więc po prostu napisałem mały sposób, aby uzyskać stało się, oto co zrobiłem:

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

Dodaj ten kod do tego samego pliku i nazwać tak:

int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind); 

Hope this helps, powodzenia!

28

Beaware !! Odpowiedź oznaczony może mieć pewne problemy, jak

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

jeśli używasz tej samej metody jak opisano w odpowiedzi na znalezienie indeks słowo „piekło”

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

dostaniesz spowodować Indexofary = 0 zamiast 4.

zamiast tego zastosowania

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

do uzyskania odpowiedniego rezultatu.

Rrgards Bity

+7

dlaczego 'InvariantCultureIgnoreCase' zamiast' OrdinalIgnoreCase'? – ManirajSS

0

1), jeśli chcesz wyszukać tylko raz i chcesz zachować tablicę źródłowego, można użyć to:

 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) jeśli będziesz szukać wielokrotnie będzie lepiej użyć to:

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

3) powyżej odpowiedź jest błędna:

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

nie działa w ogóle, ponieważ nie wyszukuje ciąg, ale podciąg.

Algorytm iteracji słowa tablicy, gdy 1-ta słowo „cześć” podjęte, algorytm próbuje znaleźć indeks „piekło” i wskaźnik ten wynosi 1. 1> 0, a następnie algorytm zakończy się bez przechodzenia do innych słów.

Jeśli nie chcesz wyszukiwać ciągów, ale chcesz wyszukiwać ciągi, algorytm powinien zostać poprawiony. Ten algorytm można naprawić, dodając opcję sprawdzenia, czy podłańcuch rozpoczyna się od pierwszego znaku t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0, a długość słów jest równa str.Length == t.Length. Poprawiono:

 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

Od Array.IndexOf jest nazwą rodzajową, ma sens, aby rodzajowe funkcję rozszerzenia:

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); 
} 
Powiązane problemy