2009-03-30 4 views
6

Ich möchte in der Lage sein, ein Array für den Inhalt einer Zeichenfolge effektiv zu suchen.
Beispiel:Wie kann ich ein Array in VB.NET suchen?

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

Ich gehe der Wert "ra" und ich möchte es den Index von 2 zurückzukehren und 3.

Wie kann ich dies in VB.NET tun?

+1

Sollten Sie nicht 0,2,3 bekommen? Sie machen eindeutig einen Filter ohne Unterscheidung der Groß- und Kleinschreibung. – belgariontheking

+0

Passing in "ra" würde Sie 0, 2 und 3 bekommen. –

+0

Stellen Sie Ihre Frage klarer Groß-und Kleinschreibung oder was? – Shimmy

Antwort

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

Hinzugefügt das in den Beitrag –

+0

Korrigiert. Ich verwechselte den Parameter 'x' mit' inputString' –

-1

Dies würde den Trick tun, um die Werte bei Indices 0, 2 und 3.

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

Dies wird nicht die Indizes zurückgeben, sondern die tatsächlichen Elemente, die nicht das OP spezifiziert. –

+0

Wahr, wahr. Ah gut ... –

+0

Array.FindAll (arr, Funktion (en) an ToLower(). StartsWith ("ra")) Ich habe Ihren Code in VB.NET 2005 verwendet, aber ich bekomme Fehler in Funktion Schlüsselwort. Es wird nicht akzeptiert, bitte helfe – somu

2

Wenn Sie eine effiziente Suche wollen Rückkehr, die oft wiederholt wird, das Array zuerst sortieren (Array.Sort) und Verwenden Sie dann Array.BinarySearch.

14

Es ist nicht genau klar, wie Sie das Array durchsuchen möchten. Hier sind einige Alternativen:

alle Gegenstände finden, die genaue Zeichenfolge „Ra“ (gibt Artikel 2 und 3) enthält:

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

alle Gegenstände finden mit der genauen Zeichenfolge beginnen „Ra“ (gibt Artikel 2 und 3):

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

alle Gegenstände finden jeden Fall Version von "ra" enthält (Retourenpositionen 0, 2 und 3):

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

alle Gegenstände finden mit jedem Fall Version von "ra" ab (Retuns Artikel 0, 2 und 3):

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

-

Wenn Sie nicht VB verwenden 9+ dann müssen Sie nicht anonym Funktionen, so müssen Sie eine benannte Funktion erstellen.

Beispiel:

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

Verbrauch:

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

mit einer Funktion, die nur für eine bestimmte Zeichenfolge vergleichen, kann nicht immer sehr nützlich ist, so in der Lage sein, eine Zeichenfolge angeben, vergleichen Sie müssten es in eine Klasse setzen, um irgendwo die Zeichenfolge zu speichern:

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 

Verbrauch:

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

Ich denke, er suchte nach dem Index – Shimmy

+0

Ja, vielleicht ... Das ist auch nicht sehr klar. – 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(); 

----- ------ Detaillierte

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

Das ist schlecht skalierbar, da es für jedes gefundene Match eine zusätzliche Zeit durch das Array durchläuft. – Guffa

+0

Das Problem ist, dass er den Index will, er will die Werte nicht. – Shimmy

+0

In einem untergeordneten Array gibt es keinen Eigenschaftenindex. Es ist eigentlich eine gute Idee, alle Elemente in einem Array sollten eine Eigenschaft Array für den Zugriff auf das Array und Index, um den Index dieses Elements im Array haben ... – Shimmy

2

Falls Sie eine ältere Version von .NET suchen wurden dann verwenden:

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

Vergiss nicht ToLower ... der Algorithmus wie geschrieben würde nicht 2 und 3, nur 0 zurückgeben. – cdmckay

+0

Das ist seine Wahl sowie Enthält oder ForEach; Er hat nicht wirklich gesagt, ob er möchte, dass seine Prüfung die Groß-/Kleinschreibung ignoriert, oder ob seine Abfrage die Funktion "StartsWith" oder "Contains" haben soll. Schauen Sie sich den vorherigen Beitrag an. – Shimmy

1

Objekte im Array vergleichen, wenn man die Eingabe übereinstimmt dann etwas auf den Wert der Schleifen aktuelle Position, die auch der Index des aktuell nachgeschlagenen Gegenstandes.

einfach zB.

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 ist dann der Index des Elements in dem Array, dann könnte Schleife verwendet werden, diese auch so in einem Array speichern anstelle der oben würden Sie haben:

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

Kontrolle dieses. .

 string[] strArray = { "ABC", "BCD", "CDE", "DEF", "EFG", "FGH", "GHI" }; 
     Array.IndexOf(strArray, "C"); // not found, returns -1 
     Array.IndexOf(strArray, "CDE"); // found, returns index 
Verwandte Themen