2009-03-30 6 views
6

Я хочу, чтобы иметь возможность эффективно искать массив для содержимого строки.
Пример:Как я могу найти массив в VB.NET?

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

проходит значение «ра», и я хочу, чтобы вернуть индекс 2 и 3.

Как я могу это сделать в VB.NET?

+1

Разве вы не получаете 0,2,3? Вы явно делаете фильтр, нечувствительный к регистру. – belgariontheking

+0

Пройдя в «ra», вы получите 0, 2 и 3. –

+0

Сделайте свой вопрос более четким и чувствительным к регистру. – Shimmy

ответ

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

Добавлено, что в сообщение –

+0

Исправлено. Я перепутал параметр 'x' с' inputString' –

-1

Это будет делать трюк, возвращая значения в 0, индексами 2 и 3.

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

Это не вернет индексы, но фактические элементы, которые не указаны OP. –

+0

Правда, правда. Ah well ... –

+0

Array.FindAll (arr, Function (s) s.ToLower(). StartsWith ("ra")) Я использовал ваш код в VB.NET 2005, но я получаю ошибку в ключевом слове Function. Он не принимает, пожалуйста, помогите – somu

2

Если вы хотите эффективный поиск, который часто повторяется, сначала отсортировать массив (Array.Sort) и затем используйте Array.BinarySearch.

14

Непонятно, как вы хотите искать массив. Вот некоторые варианты:

Найти все элементы, содержащие точную строку «Ra» (возвращает пункты 2 и 3):

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

Найти все элементы, начиная с точной строкой «Ra» (возвращает пункты 2 и 3):

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

Найти все элементы, содержащие любой случай версии "ра" (возвращает элементы 0, 2 и 3):

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

Найти все элементы, начиная с любым случаем версией «ра» (Retuns пунктов 0, 2 и 3):

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

-

Если вы не используете VB 9+, то вы не имеете анонимных функции, поэтому вам нужно создать именованную функцию.

Пример:

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

Использование:

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

Имея функцию, которая только может сравнить с определенной строки не всегда очень полезно, так, чтобы иметь возможность указать строку для сравнения вам придется поставить его в класс, чтобы где-то хранить строку:

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 

Использование:

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

Я думаю, он искал индекс – Shimmy

+0

Да, возможно ... Это тоже не очень понятно. – Guffa

0

В.Б.

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

----- Детальный ------

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

Это плохо масштабируется, так как он будет проходить через массив, дополнительное время для каждого найденного совпадения. – Guffa

+0

Проблема в том, что он хочет индекс, ему не нужны значения. – Shimmy

+0

Нет свойства Index в массиве child. На самом деле, хорошая идея, все элементы массива должны иметь свойство Array для доступа к массиву и индексу, чтобы иметь индекс этого элемента в массиве ... – Shimmy

2

В случае, если вы искали более старую версию .NET затем использовать:

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

Не забудьте ToLower ... алгоритм, как написано, не будет возвращать 2 и 3, только 0. – cdmckay

+0

Это его выбор, а также Contains или ForEach; Он действительно не сказал, хочет ли он, чтобы его чек игнорировал дело, или если он хочет, чтобы его запрос был «StartsWith» или «Contains», это его выбор. Посмотрите предыдущее сообщение. – Shimmy

1

сравнить свойства в массиве, если один соответствует то вход установить что-то к значению петли тока позиции, которая также индекс текущего поднятого предмета.

простой пример.

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 

у затем индекс элемента массива, то цикл может быть использован для хранения их в массиве также так вместо выше, вы бы:

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

проверить это. .

 string[] strArray = { "ABC", "BCD", "CDE", "DEF", "EFG", "FGH", "GHI" }; 
     Array.IndexOf(strArray, "C"); // not found, returns -1 
     Array.IndexOf(strArray, "CDE"); // found, returns index 
Смежные вопросы