Как я могу искать массив в VB.NET?

Я бы лично выбрал второй вариант (в сочетании с разумным временем ожидания для обслуживания злых клиентов, которые отправляют только половину файла и остаются там навсегда). Символ разделения - это хорошо, если вы можете абсолютно гарантировать, что он уникален в вашем потоке (но вам все еще нужно время ожидания).

Если вы не можете гарантировать, что ваш разделитель будет уникальным, отправка размера, которого клиент должен ожидать, решит проблему. Если ваши метаданные имеют фиксированную длину, вам не нужно беспокоиться о разделителях и их обнаружении.

8
задан GEOCHET 30 March 2009 в 13:48
поделиться

6 ответов

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

Найдите все объекты, содержащие точную строку "Ра" (объекты возвратов 2 и 3):

Dim result As String() = Array.FindAll(arr, Function(s) s.Contains("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"))

Найдите все объекты, запускающиеся с любой версии случая "Ра" (объекты возвратов 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)
16
ответ дан 5 December 2019 в 06:39
поделиться

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

2
ответ дан 5 December 2019 в 06:39
поделиться
Dim inputString As String = "ra"
Enumerable.Range(0, arr.Length).Where(Function(x) arr(x).ToLower().Contains(inputString.ToLower()))
3
ответ дан 5 December 2019 в 06:39
поделиться

В случае, если Вы искали более старую версию.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
2
ответ дан 5 December 2019 в 06:39
поделиться

Это добилось бы цели, возвратив значения в индексах 0, 2 и 3.

Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra"))
-1
ответ дан 5 December 2019 в 06:39
поделиться

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

-----Подробный------

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
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: