#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
перед присвоением значения.