Пока не ясно, то ли вы не знаете, как вставить что-то в вашу базу данных или вы не знаете, как разделить текст на VB.NET. Я предполагаю последнее, иначе вопрос слишком широк и не содержит достаточной информации.
Однако, я бы первым реализовать собственный класс, чтобы держать всю вашу информацию:
Public Class NumberResults
Public Sub New(number As Int32, description As String, resA As Decimal, resB As Decimal, resC As Decimal, resD As Decimal)
Me.Number = number
Me.Description = description
Me.ResultA = resA
Me.ResultB = resB
Me.ResultC = resC
Me.ResultD = resD
End Sub
Public Property Number As Int32
Public Property Description As String
Public Property ResultA As Decimal
Public Property ResultB As Decimal
Public Property ResultC As Decimal
Public Property ResultD As Decimal
Public Overrides Function ToString() As String
Return String.Format("{0} {1} {2} {3} {4}", Description, ResultA, ResultB, ResultC, ResultD)
End Function
End Class
Затем вы можете использовать LINQ для выбора каждой группы из четырех линий разбираемых в десятичную системе. Если вы используете метод TryParse
в запросе LINQ, вы должны использовать вспомогательный метод, который возвращает Nullable(Of T)
, который лучше, чем при использовании локальной переменной:
Вы могли бы эти:
Module StringExtensions
<Extension()>
Public Function TryGetInt32(Str As String) As Nullable(Of Int32)
If Str Is Nothing Then Return Nothing
Dim num As Int32
If Int32.TryParse(Str, num) Then Return num
Return Nothing
End Function
<Extension()>
Public Function TryGetIntDecimal(Str As String, Optional provider As IFormatProvider = Nothing) As Nullable(Of Decimal)
If Str Is Nothing Then Return Nothing
Dim num As Decimal
If provider Is Nothing Then provider = Globalization.NumberFormatInfo.CurrentInfo
If Decimal.TryParse(Str, Globalization.NumberStyles.Any, provider, num) Then Return num
Return Nothing
End Function
End Module
Теперь вы получите все строки из текстовое поле, которое может быть разобрано на Decimal
таким образом:
Dim numberLines = From line In TextBox1.Lines
Let numOrNull = line.TryGetIntDecimal(CultureInfo.InvariantCulture)
Where numOrNull.HasValue
Select numOrNull.Value
Этот запрос LINQ отсрочена выполняется, что означает, что в настоящее время он является не оп. Вы можете взглянуть на значения в отладчике, он содержит все 12 строк в виде десятичных знаков. Теперь я использую его в этом запросе, который делает группировку, используя \=
integer division operator:
Dim results = numberLines.
Select(Function(num, index) New With {.num = num, .index = index}).
GroupBy(Function(x) x.index \ 4).
Select(Function(grp, ix) New NumberResults(
ix + 1, String.Format("Test{0}", ix + 1),
grp.Select(Function(x) x.num).First(),
grp.Select(Function(x) x.num).ElementAtOrDefault(1),
grp.Select(Function(x) x.num).ElementAtOrDefault(2),
grp.Select(Function(x) x.num).ElementAtOrDefault(3)))
Запросы по-прежнему не выполняется, поэтому можно, например, использовать For Each
, чтобы вставить их в базу данных:
For Each res In results
Console.WriteLine(res.ToString())
Next
, который выводит (я использую запятую в качестве десятичного разделителя):
Test1 3,50 12,59 21,34 31,20
Test2 3,80 12,72 21,60 33,43
Test3 3,21 12,08 21,30 33,02