我有一個看起來像這樣的字串串列:

字串串列的專案格式如下“#,@”,其中# 代表整數,@ 代表字串或數字。
我需要找到整數小于前一項的整數的第一次出現的索引。
我可以使用回圈遍歷所有條目來找到它,如下所示:
For X = 0 To UBound(TempList.ToArray) - 1
If Val(Left(TempList(X), InStr(TempList(X), ",") - 1)) > Val(Left(TempList(X 1), InStr(TempList(X 1), ",") - 1)) Then
Dim Result As String = TempList(X) & " -- " & TempList(X 1)
End If
Next

我確信使用 linq 可以更智能地完成此操作 - 但我對 linq 的知識非常貧乏還不夠......
有人可以給我一個提示嗎?
uj5u.com熱心網友回復:
Linq 很酷,但不一定更快。它在內部回圈。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim TempList As New List(Of String) From {"450,245.5", "510,1", "520,1", "703,1", "704,0", "705,0", "706,0", "901,1.244", "921,3", "1,1", "2,1", "3,0"}
Dim Result As String = ""
For i As Integer = 1 To TempList.Count - 1
If CInt(TempList(i).Split(","c)(0)) < CInt(TempList(i - 1).Split(","c)(0)) Then
Result = $"{TempList(i)} At index {i} -- {TempList(i - 1)}"
Exit For 'Stop looping when found
End If
Next
MessageBox.Show(Result)
End Sub
uj5u.com熱心網友回復:
您可以將 LINQ 用于回圈,但我認為 aFor / For Each就足夠了 - 請參閱 Mary 的回答。
但至少,您可以使用 LINQ 將串列決議為字串以外的其他內容,以使其在使用時更易于管理。這將使您的代碼解耦一點,并使其更清晰。我會將這對資料保存在Tuple(Of Double, String). 如果我知道第一項是不同的,我會使用Dictionary(Of Double, String).
因此,為了好玩,您可以使用TakeWhile代替For / For Each.
Dim TempList = { "450,245.5", "510,1", "520,1", "701,0", "702,0", "703,1", "704,0", "705,0", "706,0", "720,0", "901.2,455", "921,3", "1,1", "2,1", "3,0"}
Dim parsedList = TempList.
Select(Function(s) s.Split(","c)).
Select(Function(ss) (CDbl(ss(0)), ss(1)))
Dim lastValue As Double = Double.NaN
Dim index = parsedList.TakeWhile(
Function(t)
Dim result = Double.IsNaN(lastValue) OrElse t.Item1 > lastValue
lastValue = t.Item1
Return result
End Function).Count()
Dim item = parsedList(index)
Console.WriteLine($"Index: {index}, number: {item.Item1}, string: {item.Item2}")
索引:12,編號:1,字串:1
這基本上只是For Each用 LINQ做一個。這可能不是必需的,并且一個簡單的回圈可以說更具可讀性,并且您也不會在性能上獲得任何好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/377624.html
