2009-03-30 17 views
6

Chcę móc skutecznie przeszukiwać tablicę pod kątem zawartości ciągu.
Przykład:Jak mogę przeszukiwać tablicę w VB.NET?

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

mijam wartość jest "ra" i chcę go do zwrotu indeksu 2 i 3.

jaki sposób można zrobić to w VB.NET?

+1

Nie powinieneś dostać 0,2,3? Wyraźnie robisz filtr niewrażliwy na wielkość liter. – belgariontheking

+0

Przekazanie w "ra" dałoby ci 0, 2 i 3. –

+0

Spraw, aby twoje pytanie było bardziej zrozumiałe, a co ważniejsze? – Shimmy

Odpowiedz

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

Dodano do wpisu –

+0

Poprawiono. Pomyliłem parametr 'x' z' inputString' –

-1

będzie to rade, wracając wartości w indeksami 0, 2 i 3.

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

To nie zwróci indeksów, ale rzeczywistych elementów, które nie są określone przez OP. –

+0

To prawda, prawda. No cóż ... –

+0

Array.FindAll (arr, funkcja (s) s.ToLower(). Zaczyna się ("ra")) Użyłem twojego kodu w VB.NET 2005, ale dostaję błąd w słowie kluczowym Function. Nie akceptuje, proszę pomóż – somu

2

Jeśli chcesz efektywnego wyszukiwania, które są często powtarzane, sortowanie tablicy (Array.Sort) i następnie użyj Array.BinarySearch.

14

Nie jest do końca jasne, w jaki sposób chcesz przeszukać tablicę. Oto kilka alternatyw:

Znajdź wszystkie przedmioty zawierające dokładnie ciąg „Ra” (zwraca pkt 2 i 3):

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

znaleźć wszystkie elementy zaczynające się dokładnie ciąg „Ra” (zwraca pozycje 2 i 3):

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

Znajdź wszystkie przedmioty zawierające każdym przypadku wersji "ra" (zwraca pozycje 0, 2 i 3):

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

Znajdź wszystkie przedmioty zaczynające każdym przypadku wersji "ra" (retuns pozycji 0, 2 i 3):

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

-

Jeśli nie używasz VB 9+ wtedy nie masz anonimowy funkcje, więc musisz utworzyć nazwaną funkcję.

Przykład:

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

Zastosowanie:

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

posiadające funkcję, że tylko można porównać do konkretnego napisu nie zawsze jest to bardzo przydatne, tak, aby móc określić ciąg do porównania abyś musiał umieścić go w klasie, aby mieć gdzieś przechowywać ciąg:

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 

Zastosowanie:

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

Myślę, że szukał indeksu – Shimmy

+0

Tak, być może ... To też nie jest zbyt jasne. – 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(); 

----- Szczegółowy ------

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

To się źle skaluje, ponieważ będzie pętlą w tablicy jeden dodatkowy czas dla każdego znalezionego meczu. – Guffa

+0

Problem polega na tym, że chce indeksu, nie chce wartości. – Shimmy

+0

Brak indeksu właściwości w tablicy potomnej. To jest naprawdę dobry pomysł, wszystkie elementy w tablicy powinny mieć właściwość Array, aby uzyskać dostęp do tablicy i indeksu, aby mieć indeks tego elementu w tablicy ... – Shimmy

2

W razie czego szukasz starszej wersji .NET następnie użyć:

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

Nie zapomnij o ToLine ... algorytm, jak napisano, nie zwróci 2 i 3, tylko 0. – cdmckay

+0

To jest jego wybór Tak samo jak Contains lub ForEach; Nie powiedział tak naprawdę, czy chce, aby jego kontrola ignorowała sprawę, czy też chce, aby jego zapytanie brzmiało "StartsWith" lub "Zawiera", to jego wybór. Zobacz poprzedni post. – Shimmy

1

porównać właściwości w tablicy jeśli pasuje wejście następnie ustawić coś do wartości pętli Aktualna pozycja, która jest również indeks aktualnie oglądanego przedmiotu.

proste np.

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 jest to indeks elementu w tablicy, a następnie pętla może być używany do przechowywania ich w tablicy również tak, zamiast nad tobą musiałby:

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

sprawdzić.

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