Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET-结合TakeWhile和SkipWhile以获得两个分区_Vb.net_Linq_List_Partitioning - Fatal编程技术网

VB.NET-结合TakeWhile和SkipWhile以获得两个分区

VB.NET-结合TakeWhile和SkipWhile以获得两个分区,vb.net,linq,list,partitioning,Vb.net,Linq,List,Partitioning,有没有一种方法可以使用相同的谓词在同一个列表上组合TakeWhile和SkipWhile来获得两个分区,或者这是过早的优化?这会在幕后自动完成吗 注意列表是按属性排序的 下面是如何在不进行优化的情况下获得分区的两部分: Dim partA = list.TakeWhile(Function(e) e.Property = True) Dim partB = list.SkipWhile(Function(e) e.Property = True) 我也可以用IEnumerator一次性完成这项

有没有一种方法可以使用相同的谓词在同一个列表上组合
TakeWhile
SkipWhile
来获得两个分区,或者这是过早的优化?这会在幕后自动完成吗

注意列表是按
属性排序的

下面是如何在不进行优化的情况下获得分区的两部分:

Dim partA = list.TakeWhile(Function(e) e.Property = True)
Dim partB = list.SkipWhile(Function(e) e.Property = True)
我也可以用
IEnumerator
一次性完成这项工作,但是如果我的收藏中没有超过几百件物品,这有什么意义呢

EDIT:这样会更好吗,因为它只在集合中迭代一次

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)

我想不出用linq做这件事的方法,您可能需要自己做一个for循环。话虽如此,除非评估谓词是一项非常昂贵的操作,否则这可能是过早的优化,您现在拥有的内容的可读性可能会超过性能提升和代码块的可读性。我认为这实际上不是很好。使用助手方法将列表一分为二会更好。@Chris My谓词就像单个属性到字符串的比较一样简单。这只是从e.property=True到e.property=False的第一个转换,或者你只是对按e.属性进行分区感兴趣?@JerryFederspiel我现在将按属性进行分区,所以我将看看
ToLookup
的工作情况。我希望我早知道这个函数。我刚才在问题中澄清了这一点。列表是预先排序的。因此,假设在使用
ToLookup
之后,我需要执行
partA.AddRange(itemsByProperty(True))
partB
(或
Concat()
)的操作,您知道这是否与我在编辑中所做的操作具有类似的性能吗?(我的问题中没有显示它,但我需要将我的结果添加到另一个已经存在的集合中)我没有测量它,但我的解决方案很可能比您的解决方案慢一个常数因子。最后的AddRange对这两个方面的性能惩罚基本相同。如果性能至关重要,您可以尝试直接将项目添加到最终集合,而不是(添加到partA,然后使用AddRange)。问题是AddRange可能能够避免过多地调整备份数组的大小,因为它最终知道要添加多少元素,所以这种方法实际上可能没有帮助。也许值得尝试这两种方法和措施。我也猜Concat会比AddRange差得多。AddRange直接在列表上实现,可以智能地和支持数组一起工作;Concat是一种扩展方法,必须使用任何旧的IEnumerable。