Я бы лично выбрал второй вариант (в сочетании с разумным временем ожидания для обслуживания злых клиентов, которые отправляют только половину файла и остаются там навсегда). Символ разделения - это хорошо, если вы можете абсолютно гарантировать, что он уникален в вашем потоке (но вам все еще нужно время ожидания).
Если вы не можете гарантировать, что ваш разделитель будет уникальным, отправка размера, которого клиент должен ожидать, решит проблему. Если ваши метаданные имеют фиксированную длину, вам не нужно беспокоиться о разделителях и их обнаружении.
Не точно ясно, как Вы хотите искать массив. Вот некоторые альтернативы:
Найдите все объекты, содержащие точную строку "Ра" (объекты возвратов 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)
Если Вы хотите эффективный поиск, который часто повторяется, первый вид массив (Array.Sort
) и затем используйте Array.BinarySearch
.
Dim inputString As String = "ra"
Enumerable.Range(0, arr.Length).Where(Function(x) arr(x).ToLower().Contains(inputString.ToLower()))
В случае, если Вы искали более старую версию.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, 2 и 3.
Array.FindAll(arr, Function(s) s.ToLower().StartsWith("ra"))
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