VB.NET - 合并 TakeWhile 和 SkipWhile 以获得两个分区
VB.NET - Combine TakeWhile and SkipWhile to get both partitions
有没有办法使用相同的谓词将 TakeWhile
和 SkipWhile
组合在同一个列表上以获得两个分区,或者这会是过早的优化吗?这会在幕后自动完成吗?
注意列表按Property
排序
下面是我如何在不优化的情况下获得分区的两半:
Dim partA = list.TakeWhile(Function(e) e.Property = True)
Dim partB = list.SkipWhile(Function(e) e.Property = True)
我也可以用 IEnumerator
一次性做到这一点,但是如果我在 collection 中没有超过几百个项目有什么意义吗?
编辑:这样会更好吗,因为它只遍历 collection 一次?
Dim partA As List(Of MyType)
Dim partB As List(Of MyType)
Dim iter = list.GetEnumerator()
While iter.MoveNext()
If iter.Current.Property = True Then
partA.Add(iter.Current)
Else
partB.Add(iter.Current)
End If
End While
您的编辑不等同于您问题中的前两行代码,除非所有正确都出现在所有错误之前。如果你想要一种内置的方式来做你在编辑中所做的事情,你可以做
Dim itemsByProperty = list.ToLookup(Function(e) e.Property)
现在 partA
相当于 itemsByProperty(True)
,partB
相当于 itemsByProperty(False)
。
有没有办法使用相同的谓词将 TakeWhile
和 SkipWhile
组合在同一个列表上以获得两个分区,或者这会是过早的优化吗?这会在幕后自动完成吗?
注意列表按Property
下面是我如何在不优化的情况下获得分区的两半:
Dim partA = list.TakeWhile(Function(e) e.Property = True)
Dim partB = list.SkipWhile(Function(e) e.Property = True)
我也可以用 IEnumerator
一次性做到这一点,但是如果我在 collection 中没有超过几百个项目有什么意义吗?
编辑:这样会更好吗,因为它只遍历 collection 一次?
Dim partA As List(Of MyType)
Dim partB As List(Of MyType)
Dim iter = list.GetEnumerator()
While iter.MoveNext()
If iter.Current.Property = True Then
partA.Add(iter.Current)
Else
partB.Add(iter.Current)
End If
End While
您的编辑不等同于您问题中的前两行代码,除非所有正确都出现在所有错误之前。如果你想要一种内置的方式来做你在编辑中所做的事情,你可以做
Dim itemsByProperty = list.ToLookup(Function(e) e.Property)
现在 partA
相当于 itemsByProperty(True)
,partB
相当于 itemsByProperty(False)
。