2014-11-12 4 views
0

Так что моя проблема заключается в том:
У меня есть список из пользовательского типа {Id, как Integer, Tag() As String}
и я хочу, чтобы выполнить поиск многооконного критерия в теме; например: SearchTags = { "Документ", "HelloWorld"} Результаты поиска будут помещены в ListBox (listbox1) в следующем формате:
resultItem.id & "-" & resultItem.tagsнесколько критериев поиска (VB.NET)

Я уже попробовал все, что мог найти на форумах, но это не сработало для меня (это было для db или для строковых типов данных)

Теперь мне действительно нужна ваша помощь. Заранее спасибо.

For Each MEntry As EntryType In MainList 
     For Each Entry In MEntry.getTags 
      For Each item As String In Split(TextBox1.Text, " ") 
       If Entry.Contains(item) Then 
        If TestIfItemExistsInListBox2(item) = False Then 
         ListBox1.Items.Add(item & " - " & Entry.getId) 
        End If 
       End If 
      Next 
     Next 
    Next 

Пример пользовательский массив:

(24,{"snippet","vb"}) 
(32,{"console","cpp","helloworld"}) 
and so on... 

Я искал ("SNIPPET Vb тест"):

snippet vb helloWorld - 2 
snippet vb tcpchatEx - 16 
cs something 
test 

Таким образом, я получу все, что содержит одну из моих фраз ,

Я ожидал следующее:

snippet vb tcp test 
snippet vb dll test 
snippet vb test metroui 

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


Мой весь, код-класс скорее всего

Imports Newtonsoft.Json 
Public Class Form2 
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    End Sub 
    Dim MainList As New List(Of EntryType) 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MainList.Clear() 
     Dim thr As New Threading.Thread(AddressOf thr1) 
     thr.SetApartmentState(Threading.ApartmentState.MTA) 
     thr.Start() 
    End Sub 
    Delegate Sub SetTextCallback([text] As String) 
    Private Sub SetTitle(ByVal [text] As String) ' source <> mine 
     If Me.TextBox1.InvokeRequired Then 
      Dim d As New SetTextCallback(AddressOf SetTitle) 
      Me.Invoke(d, New Object() {[text]}) 
     Else 
      Me.Text = [text] 
     End If 
    End Sub 
    Sub thr1() 
     Dim linez As Integer = 1 
     Dim linex As Integer = 1 
     For Each line As String In System.IO.File.ReadAllLines("index.db") 
      linez += 1 
     Next 

     For Each line As String In System.IO.File.ReadAllLines("index.db") 
      Try 
       Application.DoEvents() 
       Dim a As saLoginResponse = JsonConvert.DeserializeObject(Of saLoginResponse)(line) ' source <> mine 
       Application.DoEvents() 
       MainList.Add(New EntryType(a.id, Split(a.tags, " "))) 
       linex += 1 
       SetTitle("Search (loading, " & linex & " of " & linez & ")") 
      Catch ex As Exception 

      End Try 
     Next 
     SetTitle("Search") 
    End Sub 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Dim searchTags() As String = TextBox1.Text.Split(" ") 
     Dim query = MainList.Where(Function(et) et.Tags.Any(Function(tag) searchTags.Contains(tag))).ToList 
     For Each et In query 
      ListBox1.Items.Add(et.Id) 
     Next 
    End Sub 
    Private Sub Button4_Click(sender As Object, e As EventArgs) ' test 
     MsgBox(Mid(ListBox1.SelectedItem.ToString, 1, 6)) ' test 
    End Sub 'test, removeonrelease 
End Class 
Public Class EntryType 
    Public Property Id As Integer 
    Public Property Tags() As String 
    Public Sub New(ByVal _id As Integer, ByVal _tags() As String) 
     Me.Id = Id 
     Me.Tags = Tags 
    End Sub 
    Public Function GetTags() As String 
     'to tell the Listbox what to display 
     Return Tags 
    End Function 
    Public Function GetId() As Integer 
     'to tell the Listbox what to display 
     Return Id 
    End Function 
End Class 

Я редактировал свой класс EntryType; Я добавил конструктор, удалил toString и добавил GetTags и GetID.


Пример "DB" им, работающие с ("DB", как "index.db" в директории ехес):

{"tags":"vb.net lol test qwikscopeZ","id":123456} 
{"tags":"vb.net lol test","id":12345} 
{"tags":"vb.net lol","id":1234} 
{"tags":"vb.net","id":123} 
{"tags":"cpp","id":1} 
{"tags":"cpp graphical","id":2} 
{"tags":"cpp graphical fractals","id":3} 
{"tags":"cpp graphical fractals m4th","id":500123} 

Ошибка:

Debugger:Exception Intercepted: _Lambda$__1, Form2.vb line 44 
An exception was intercepted and the call stack unwound to the point before the call from user code where the exception occurred. "Unwind the call stack on unhandled exceptions" is selected in the debugger options. 
Time: 13.11.2014 03:46:10 
Thread:<No Name>[5856] 
+0

вы можете дать некоторые данные дб образца – Mozzie

+0

Это не дб, его массив пользовательского типа (идентификатор в виде целого числа, тег() в виде строки) – David

+0

Параметр '' GetId' и функции GetTags' являются избыточными, так как вы можете просто вызвать свойства напрямую - FYI – OneFineDay

ответ

0

здесь a Lambda запрос. Фильтры Where на предикате, так как Tags является Array, вы можете использовать функцию Any для выполнения поиска по другим параметрам Array - SearchTags. Вы можете хранить каждый объект класса в Listbox, поскольку он хранит объекты, вам просто нужно сказать, что отображать (см. Ниже).

Public Class EntryType 
    Public Property Id As Integer 
    Public Property Tags() As As String 
    Public Overrides Function ToString() As String 
    'to tell the Listbox what to display 
    Return String.Format("{0} - {1}", Me.Id, String.Join(Me.Tags, " ")) 
    End Function 
End Class 

Dim searchTags = textbox1.Text.Split(" "c) 
Dim query = mainlist.Where(Function(et) et.Tags.Any(Function(tag) searchTags.Contains(tag))).ToList 
For Each et In query 
    Listbox1.Items.Add(et) 
Next 
+0

В этом последнем комментарии есть несколько вопросов, можете ли вы ответить на них? – OneFineDay

+0

Мое приложение разбилось в строке, где был создан запрос; Значение не может быть NULL; (см. op); Мне нужно получить все результаты, которые соответствуют всем моим поисковым запросам, а не только один/+ из них. – David

+0

Я вижу место, где вы очищаете MainList - запрос не может работать, если он пуст. – OneFineDay

Смежные вопросы