2009-03-30 28 views
6

Tôi muốn có thể tìm kiếm một cách hiệu quả một mảng cho nội dung của một chuỗi.
Ví dụ:Làm thế nào tôi có thể tìm kiếm một mảng trong VB.NET?

dim arr() as string={"ravi","Kumar","Ravi","Ramesh"} 

tôi vượt qua giá trị là "ra" và tôi muốn nó trở lại chỉ số của 2 và 3.

Làm thế nào tôi có thể làm điều này trong VB.NET?

+1

Bạn không nên lấy 0,2,3? Bạn rõ ràng đang làm một bộ lọc phân biệt chữ hoa chữ thường. – belgariontheking

+0

Đi qua trong "ra" sẽ giúp bạn 0, 2 và 3. –

+0

Làm cho câu hỏi của bạn rõ ràng hơn hoặc nhạy cảm hơn? – Shimmy

Trả lời

3
Dim inputString As String = "ra" 
Enumerable.Range(0, arr.Length).Where(Function(x) arr(x).ToLower().Contains(inputString.ToLower())) 
+0

Đã thêm vào bài đăng –

+0

Đã sửa. Tôi nhầm lẫn tham số 'x' với' inputString' –

-1

này sẽ làm các trick, trả lại giá trị tại indeces 0, 2 và 3.

Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra")) 
+0

Điều này sẽ không trả lại các chỉ mục mà các phần tử thực tế, không phải là OP xác định. –

+0

Đúng, đúng. Ah well ... –

+0

Array.FindAll (arr, Function (s) s.ToLower(). StartsWith ("ra")) Tôi đã sử dụng mã của bạn trong VB.NET 2005 nhưng tôi nhận được lỗi trong từ khóa chức năng. Nó không được chấp nhận, hãy giúp – somu

2

Nếu bạn muốn một tìm kiếm hiệu quả thường được lặp đi lặp lại, sắp xếp đầu tiên trên mảng (Array.Sort) và sau đó sử dụng Array.BinarySearch.

14

Không rõ chính xác cách bạn muốn tìm kiếm mảng. Dưới đây là một số lựa chọn thay thế:

Tìm tất cả các mục có chứa các chuỗi chính xác "Ra" (trả về mục 2 và 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.Contains("Ra")) 

Tìm tất cả các mục bắt đầu với chuỗi chính xác "Ra" (trả về mục 2 và 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.StartsWith("Ra")) 

Tìm tất cả các mục có chứa bất kỳ phiên bản chữ của "ra" (trả về mục 0, 2 và 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.ToLower().Contains("ra")) 

Tìm tất cả các mục bắt đầu với bất kỳ phiên bản chữ của "ra" (retuns mục 0, 2 và 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra")) 

-

Nếu bạn không sử dụng VB 9 + sau đó bạn không cần phải ẩn danh các hàm, do đó bạn phải tạo một hàm được đặt tên.

Ví dụ:

Function ContainsRa(s As String) As Boolean 
    Return s.Contains("Ra") 
End Function 

Cách sử dụng:

Dim result As String() = Array.FindAll(arr, ContainsRa) 

Có một chức năng mà chỉ có thể so sánh với một chuỗi cụ thể không phải lúc nào cũng rất hữu ích, vì vậy để có thể xác định một chuỗi để so sánh để bạn sẽ phải đặt nó trong một lớp học để có một nơi nào đó để lưu trữ chuỗi:

Public Class ArrayComparer 

    Private _compareTo As String 

    Public Sub New(compareTo As String) 
     _compareTo = compareTo 
    End Sub 

    Function Contains(s As String) As Boolean 
     Return s.Contains(_compareTo) 
    End Function 

    Function StartsWith(s As String) As Boolean 
     Return s.StartsWith(_compareTo) 
    End Function 

End Class 

Cách sử dụng:

Dim result As String() = Array.FindAll(arr, New ArrayComparer("Ra").Contains) 
+1

Tôi nghĩ anh ta đang tìm kiếm chỉ số – Shimmy

+0

Vâng, có lẽ ... Điều đó cũng không rõ ràng lắm. – Guffa

0

VB

Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"} 
Dim result = arr.Where(Function(a) a.Contains("ra")).Select(Function(s) Array.IndexOf(arr, s)).ToArray() 

C#

string[] arr = { "ravi", "Kumar", "Ravi", "Ramesh" }; 
var result = arr.Where(a => a.Contains("Ra")).Select(a => Array.IndexOf(arr, a)).ToArray(); 

----- Chi tiết ------

Module Module1 

    Sub Main() 
     Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"} 
     Dim searchStr = "ra" 
     'Not case sensitive - checks if item starts with searchStr 
     Dim result1 = arr.Where(Function(a) a.ToLower.StartsWith(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray 
     'Case sensitive - checks if item starts with searchStr 
     Dim result2 = arr.Where(Function(a) a.StartsWith(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray 
     'Not case sensitive - checks if item contains searchStr 
     Dim result3 = arr.Where(Function(a) a.ToLower.Contains(searchStr)).Select(Function(s) Array.IndexOf(arr, s)).ToArray 
     Stop 
    End Sub 

End Module 
+0

Đó là quy mô nặng, vì nó sẽ lặp qua mảng một thêm thời gian cho mỗi trận đấu được tìm thấy. – Guffa

+0

Vấn đề là anh ta muốn chỉ mục, anh ta không muốn các giá trị. – Shimmy

+0

Không có chỉ mục thuộc tính nào trong một mảng con. Nó thực sự là một ý tưởng tốt, tất cả các mục trong một mảng nên có một tài sản Mảng để truy cập vào mảng và chỉ mục để có chỉ số của mục này trong mảng ... – Shimmy

2

Trong trường hợp bạn đang tìm kiếm một phiên bản cũ của .NET sau đó sử dụng:

Module Module1 

    Sub Main() 
     Dim arr() As String = {"ravi", "Kumar", "Ravi", "Ramesh"} 
     Dim result As New List(Of Integer) 
     For i As Integer = 0 To arr.Length 
      If arr(i).Contains("ra") Then result.Add(i) 
     Next 
    End Sub 

End Module 
+0

Đừng quên ToLower ... thuật toán như được viết sẽ không trả về 2 và 3, chỉ 0. – cdmckay

+0

Đó là lựa chọn của anh ấy Cũng như Chứa hoặc Bỏ qua; Anh ta không thực sự nói nếu anh ta muốn séc của mình bỏ qua trường hợp, hoặc nếu anh ta muốn truy vấn của mình là "StartsWith" hoặc "Chứa" chức năng, đó là sự lựa chọn của anh ta. Nhìn vào bài trước. – Shimmy

1

so sánh các thuộc tính trong mảng nếu phù hợp với đầu vào sau đó thiết lập một cái gì đó với giá trị của các vòng vị trí hiện tại, mà cũng là chỉ số của mục hiện tại đã tra cứu.

ví dụ đơn giản.

dim x,y,z as integer 
dim aNames, aIndexes as array 
dim sFind as string 
for x = 1 to length(aNames) 

    if aNames(x) = sFind then y = x 

y là sau đó chỉ số của mặt hàng đó trong mảng, sau đó vòng lặp có thể được sử dụng để lưu trữ chúng trong một mảng cũng nên thay vì ở trên bạn sẽ phải:

z = 1 
for x = 1 to length(aNames) 
    if aNames(x) = sFind then 
     aIndexes(z) = x 
     z = z + 1 
    endif 
1

việc kiểm tra này. .

 string[] strArray = { "ABC", "BCD", "CDE", "DEF", "EFG", "FGH", "GHI" }; 
     Array.IndexOf(strArray, "C"); // not found, returns -1 
     Array.IndexOf(strArray, "CDE"); // found, returns index 
Các vấn đề liên quan