不清楚您是否不知道如何将某些内容插入到您的数据库中,或者您不知道如何使用 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 选择每组四行并解析为十进制。如果您在 LINQ 查询中使用 TryParse 方法,则应使用返回 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