2009-04-20 25 views
6

Về cơ bản, tôi cần phải thực hiện String.IndexOf() và tôi cần lấy mảng chỉ mục từ chuỗi nguồn.Tìm nhiều chỉ mục từ chuỗi nguồn

Có cách nào dễ dàng để lấy mảng chỉ mục không?

Trước khi đặt câu hỏi này, tôi đã Googled rất nhiều, nhưng không tìm thấy giải pháp dễ dàng để giải quyết vấn đề đơn giản này.

+0

Trường hợp chuỗi con có trùng lặp không? – Andy

Trả lời

5
var indexs = "Prashant".MultipleIndex('a'); 

//Extension Method's Class 
    public static class Extensions 
    { 
     static int i = 0; 

     public static int[] MultipleIndex(this string StringValue, char chChar) 
     { 

      var indexs = from rgChar in StringValue 
         where rgChar == chChar && i != StringValue.IndexOf(rgChar, i + 1) 
         select new { Index = StringValue.IndexOf(rgChar, i + 1), Increament = (i = i + StringValue.IndexOf(rgChar)) }; 
      i = 0; 
      return indexs.Select(p => p.Index).ToArray<int>(); 
      } 
    } 
+0

Làm thế nào tôi có thể làm điều đó, nếu tôi cần chChar là chuỗi? Cảm ơn bạn. –

+0

Hãy để tôi kiểm tra nó .. –

15

Làm thế nào về phương pháp mở rộng này:

public static IEnumerable<int> IndexesOf(this string haystack, string needle) 
{ 
    int lastIndex = 0; 
    while (true) 
    { 
     int index = haystack.IndexOf(needle, lastIndex); 
     if (index == -1) 
     { 
      yield break; 
     } 
     yield return index; 
     lastIndex = index + needle.Length; 
    } 
} 

Lưu ý rằng khi tìm kiếm "AA" trong "XAAAY" mã này bây giờ sẽ chỉ mang lại 1.

Nếu bạn thực sự cần một mảng, gọi ToArray() về kết quả. (. Đây là giả .NET 3.5 và do đó hỗ trợ LINQ)

+0

Bạn có thể vui lòng điều chỉnh nó, để nó chỉ trả lại 1 –

+0

thay vì tiến lên 1, trước bằng chiều dài của kim - để sử dụng danh pháp của Jon :) –

+0

Chính xác - nhưng có thể hơi khó để tìm ra chính xác vị trí để làm điều đó :) Tôi đã sửa mã. –

6

Bạn sẽ phải lặp, tôi nghi ngờ:

 int start = 0; 
     string s = "abcdeafghaji"; 
     int index; 
     while ((index = s.IndexOf('a', start)) >= 0) 
     { 
      Console.WriteLine(index); 
      start = index + 1; 
     } 
2

Sử dụng một giải pháp mà sử dụng regex có thể đáng tin cậy hơn, bằng cách sử dụng indexOf chức năng có thể không đáng tin cậy. Nó sẽ tìm tất cả các kết quả phù hợp và chỉ mục, không phù hợp với cụm từ chính xác có thể dẫn đến kết quả không mong muốn. Chức năng này giải quyết bằng cách sử dụng thư viện Regex.

public static IEnumerable<int> IndexesOf(string haystack, string needle) 
{ 
     Regex r = new Regex("\\b(" + needle + ")\\b"); 
     MatchCollection m = r.Matches(haystack); 

     return from Match o in m select o.Index; 
} 
Các vấn đề liên quan