2012-01-20 15 views
16

Tôi có một chuỗiLàm thế nào để thêm một lựa chọn case-insensitive để Array.IndexOf

string str="hello"; 

Đây là mảng tôi

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

tôi cần phải tìm ra chỉ số của "hello" từ mảng (Nếu không có sử dụng một loop)

Vì vậy, tôi đã sử dụng

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

Điều này trả về -1, nhưng tôi mong đợi kết quả là 1.

Tôi thậm chí đã thử với StringComparer.OrdinalIgnoreCase nhưng không có kết quả.

Hy vọng ai đó có thể trợ giúp. Cảm ơn.

Trả lời

4

Vì bạn đang tìm kiếm chỉ mục. Hãy thử cách này.

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

Lưu ý rằng câu trả lời này tìm kiếm cho một _substring_ của chuỗi tham chiếu trong mỗi phần tử của mảng đầu vào được liệt kê bởi 'Array.FindIndex()', do sử dụng 'System.String.IndexOf()'. Để khớp các phần tử đầy đủ, hãy sử dụng quá tải tương tự 'System.String.Equals()', như được hiển thị trong các câu trả lời khác. – mklement0

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

Array.IndexOf gọi phương thức mặc định "Tương đương" phân biệt chữ hoa chữ thường. Hãy thử điều này:

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

Tôi đã có một vấn đề tương tự, tôi cần chỉ số của mặt hàng đó nhưng nó phải là trường hợp nhạy cảm, tôi nhìn quanh trên web cho một vài phút và thấy không có gì, vì vậy tôi chỉ viết một phương pháp nhỏ để có được nó xong, đây là những gì tôi đã làm:

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

Thêm mã này vào cùng một tập tin, và gọi nó là như thế này:

int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind); 

Hope this helps, chúc may mắn!

28

Beaware !! Câu trả lời được đánh dấu có thể có một số vấn đề, như

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

nếu bạn sử dụng cùng một phương pháp như mô tả trong câu trả lời cho thấy chỉ số của từ "địa ngục"

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

bạn sẽ nhận được kết quả Indexofary = 0 thay vì 4.

thay vì rằng việc sử dụng

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

để có được kết quả chính xác.

Rrgards Bits

+7

tại sao 'InvariantCultureIgnoreCase' thay vì' OrdinalIgnoreCase'? – ManirajSS

0

1) nếu bạn muốn tìm kiếm một lần duy nhất và muốn giữ lại mảng nguồn, bạn có thể sử dụng này:

 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) nếu bạn sẽ tìm kiếm nhiều lần sẽ tốt hơn nếu sử dụng điều này:

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

3) câu trả lời ở trên là không chính xác:

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

sẽ không làm việc ở tất cả, vì nó tìm kiếm không phải là chuỗi, nhưng chuỗi con.

Thuật toán lặp lại các từ trong mảng, khi từ 1 "hello" được thực hiện, thuật toán sẽ tìm chỉ mục 'địa ngục' và chỉ mục này là 1. 1> sau đó 0 và thuật toán sẽ kết thúc mà không chuyển sang các từ khác.

Nếu bạn không muốn tìm kiếm chất nền nhưng muốn tìm kiếm chuỗi, thì cần phải cố định algorythm. Thuật toán này có thể được cố định bằng cách thêm kiểm tra xem chuỗi con có bắt đầu từ 1st char t.IndexOf(str, StringComparison.InvariantCultureIgnoreCase) == 0 và độ dài của các từ bằng str.Length == t.Length hay không. Cố định:

 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

Kể từ Array.IndexOf là chung chung, nó làm cho tinh thần để thực hiện một chức năng mở rộng generic:

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); 
} 
Các vấn đề liên quan