我有一个顺序的记录列表。该简化的结构如下:使用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',那么这将会很有帮助,因为这个问题有点令人困惑 –