我有一個順序的記錄列表。該簡化的結構如下:使用LINQ從屬性值中刪除項目使用LINQ
Underline Text Order
-1 Header1 1
-1 SubHeader1 2
0 Data1 3
-1 Header2 4 // this needs to be removed
-1 SubHeader2 5 // this needs to be removed
-1 Header3 6
-1 SubHeader3 7
0 Data3 8
0 Data3a 9
現在,由於沒有爲「頭2」無數據/「SubHeader2」對時,它需要被刪除。我可以這樣做For ...下一個循環查看「Order」列,並根據序列中當前的位置對+2項進行假設。有沒有辦法與LINQ做到這一點?
編輯:這是一個任意的頭對列表和至少一個或多個數據線。有時數據線丟失。需要刪除丟失數據行的「Header」/「SubHeader」對。
編輯2:這是我刪除不需要的標題對試圖緩解缺乏通過評論和投票工作的批評:
' Sorry for the VB listing. I thought the C# question tag would reach a wider audience
Class SequentialObject
Public Property Underline As Integer
Public Property Text As String
Public Property Order As Integer
End Class
Shared Sub RemoveHeaderPairsWithNoDataLines()
Dim sequentialObjectsList As New List(Of SequentialObject)
Dim itemsToRemove As New List(Of SequentialObject)
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "Header1", .Order = 1})
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "SubHeader1", .Order = 2})
sequentialObjectsList.Add(New SequentialObject With {.Underline = 0, .Text = "Data1", .Order = 3})
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "Header2", .Order = 4})
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "SubHeader2", .Order = 5})
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "Header3", .Order = 6})
sequentialObjectsList.Add(New SequentialObject With {.Underline = -1, .Text = "SubHeader3", .Order = 7})
sequentialObjectsList.Add(New SequentialObject With {.Underline = 0, .Text = "Data3", .Order = 8})
sequentialObjectsList.Add(New SequentialObject With {.Underline = 0, .Text = "Data3a", .Order = 9})
For Each sequentialObject As SequentialObject In sequentialObjectsList
' ignoring here the index out of bounds if current header/subheader are last in the list
Dim isUnderlinedTwoLinesAhead As Boolean = (sequentialObjectsList(sequentialObject.Order + 2).Underline = -1)
If isUnderlinedTwoLinesAhead Then
itemsToRemove.Add(sequentialObject)
End If
Next
For Each itemToRemove As SequentialObject In itemsToRemove
sequentialObjectsList.Remove(itemToRemove)
Next
End Sub
所以在這裏你的規則並不完全清楚。所以基本上,如果有一個條目的文本* fooN *,其中* foo *是一些字符串,* N *是一個int,如果沒有* DataN *,請將其刪除?或者它只是它們在列表中的位置的函數(在這種情況下,它總是2項然後'數據'?如果不是,那麼如何刪除這兩項而不是下兩項? –
另外,是'DataN'是唯一可能丟失的項目?或者您是否需要確保對於任何給定的'N',都存在3個'Text'類型? –
您提到可以使用'for/next'循環執行此操作。如果你先創建了一個工作版本,然後詢問它是否可以轉換爲'Linq',那麼這將會很有幫助,因爲這個問題有點令人困惑 –