我有一個串列(ClassA),其中包括一個串列(ClassB)。這其中包含一個名為 "標題 "的字串。 我使用一個文本框讀入一個新的字串。我想檢查這個新字串是否已經存在。
我之前的代碼可以作業,但我認為可以用一種更優雅的方式來完成。我發現這有點困難,因為我有這個類結構。我為你創建了一個新的專案,只復制了必要的--但可重復的--源代碼。
Form1.vb
Imports Microsoft.VisualBasic.ControlChars
Public NotInheritable Class FormMain
Private allA As New List(Of ClassA)
Private the_new_String As String = ""
Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase. 加載
allA.Add(New ClassA)
End Sub。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1. 點擊
For i As Integer = 0 To allA. Count - 1 Step 1.
For j As Integer = 0 To allA(i). allB.Count - 1 Step 1。
If allA(i).allB(j).Heading = the_new_String Then
MessageBox.Show($"Diesen Titel gibt es bereits.{NewLine}這個標題已經存在。"。
"",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
回傳。
End If
下一步 下一步
下一步 下一步
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1. 變化了的文本
the_new_String = TextBox1.Text。
結束 sub
End Class
ClassA.vb
Public Class ClassA
Public allB As New List(Of ClassB)
Public Sub New()
allB.Add(NewClassB())
End Sub
結束 類
ClassB.vb
Public Class ClassB
Public Heading As String = "Test"
結束 類別
uj5u.com熱心網友回復:
If allA.Any(Function(a) a.allB.Any(Function(b) b.Heading = the_new_String) 然后
'指定的文本已經存在。
End If
uj5u.com熱心網友回復:
你的嵌套回圈沒有任何問題。你所做的任何其他事情最終都會編譯成相同的嵌套回圈(盡管回圈陳述句可能隱藏在Linq函式呼叫中)。 例如,在張貼的其他答案中,每個Any呼叫都隱藏了一個回圈。
作為另一種選擇,你可以考慮使用SelectMany,它是用于平坦化層次結構的Linq程式。
其結果將是,
If allA. SelectMany(Function(a) a.allB.Select(Function(b) b.Heading) ) _
.Any(Function( heading) heading = testString) Then
'建議的標題已經存在。
結束 若
我相信這樣做的結果會與你的原始代碼或其他答案中的代碼有類似的演算法效率。 SelectMany, Select, 和 Any 都應該使用延遲執行,所以我認為一旦發現匹配,它就會跳出隱式嵌套回圈,而不需要額外的迭代。 (推理Linq將給你的集合操作是很容易的,但是識別隱藏在陳述句背后的回圈復雜性卻不一定容易,特別是當一些Linq函式將急于評估,而其他函式將延遲時。)
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/308295.html
標籤:
