Поиск текстового файла с разделителями в 2D-массиве

#vb.net

#vb.net

Вопрос:

Я выделил текстовый файл с разделителями и поместил его в 2D-массив. Затем я попытался выяснить, содержит ли массив идентификатор продукта (введенный в текстовое поле). Однако код, который я использовал для поиска в массиве и отображения имени, не работает. В текстовом файле указано: 1, Фрэнсис 2, Эмма

Вот мой код:

 Public Class Form1
    Dim filename As String
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        filename = "names.txt"

    End Sub

    Private Sub btnsearch_Click(sender As Object, e As EventArgs) Handles btnsearch.Click


        filename = "names.txt"
        FileOpen(1, filename, OpenMode.Input,,,)

        Dim lines() As String = IO.File.ReadAllLines("names.txt")
        Dim values(lines.Length - 1, 1) As String
        For i As Integer = 0 To lines.Length - 1
            Dim parts() As String = lines(i).Split(","c)
            values(i, 0) = parts(0)
            values(i, 1) = parts(1)
        Next

        Dim ID As String
        ID = txtidsearch.Text

        Dim line As String

        Do While Not EOF(1)
            line = LineInput(1)

            If values().Contains(ID) Then
                lblid.Text = line
                Application.DoEvents()
                GoTo line1
            ElseIf EOF(1) = True
                MsgBox("Not Found")

            End If
        Loop
line1:
        FileClose(1)

    End Sub
End Class
  

Заранее спасибо

Ответ №1:

Что я бы сделал, так это создал класс для хранения ваших людей. В конечном итоге это упростило бы задачу.

Сначала создайте Person класс:

 Imports System.Collections.ObjectModel
Public Class Person
   Public Key As String

   Public Sub New(ByVal id As Integer,
                  ByVal name As String,
                  ByVal form as String)

       _id = id
       _name = name
       _form = form

   End Sub

   Private _id As Integer
   Public ReadOnly Property Id() As Integer
       Get
           Return _id
       End Get

   End Property

   Private _name As String
   Public ReadOnly Property Name() As String
       Get
           Return _name
       End Get
   End Property

   Private _form As String
   Public ReadOnly Property Form() As String
       Get
           Return _form
       End Get
   End Property

   End Class
  

Теперь создайте People класс, который будет коллекцией для хранения каждого Person :

 Public Class People
    Inherits KeyedCollection(Of String, Person)

    Protected Overrides Function GetKeyForItem(ByVal item As Person) As String
        Return item.Key
    End Function

End Class
  

Затем я бы изменил этот фрагмент кода:

 Dim values(lines.Length - 1, 1) As String
For i As Integer = 0 To lines.Length - 1
    Dim parts() As String = lines(i).Split(","c)
    values(i, 0) = parts(0)
    values(i, 1) = parts(1)
Next
  

Для этого:

 Dim myPeople As New People
For i As Integer = 0 To lines.Length - 1
    Dim parts() As String = lines(i).Split(","c)
    myPeople.Add(New Person(parts(0), parts(1), parts(2)))
Next
  

Обратите внимание, что я добавляю новый Person класс в People класс коллекции.

И я бы заменил этот код:

 Dim line As String

Do While Not EOF(1)
    line = LineInput(1)

    If values().Contains(ID) Then
        lblid.Text = line
        Application.DoEvents()
        GoTo line1
    ElseIf EOF(1) = True
        MsgBox("Not Found")

    End If
Loop
line1:
  

С помощью этого:

 Dim filteredLines = From people In myPeople
                    Where people.Id = ID
                    Select people

If filteredLines IsNot Nothing AndAlso filteredLines.Count = 1 Then
    Label1.Text = filteredLines(0).Name
End If
  

Этот последний бит кода является LINQ:

Средства запросов общего назначения, добавленные в .NET Framework, применяются ко всем источникам информации, а не только к реляционным или XML-данным. Это средство называется .NET Language-Integrated Query (LINQ).

Используя LINQ, мы можем запрашивать People класс коллекции, как таблицу в базе данных, используя аналогичный синтаксис. Здесь я выбираю все People , где ID совпадают. Затем я проверяю, чтобы убедиться, что filteredLines на самом деле имеет a Person перед присвоением значения.