从 VB.net 中的列表中删除除值区间以外的所有内容

Removing everything but an interval of values from a list in VB.net

我有一个列表

Dim list as New List(Of Double)

它包含从 0 到 1000 的值。我想将值保持在区间 [360 ; 720]。 以下代码适用于我,但我确信有更有效的方法:

Dim index As Integer

Do
    list.RemoveAt(index)
Loop Until list(index) > 360

For i = list.Count - 1 To 0 Step -1
    If list(i) > 720 Then
        list.RemoveAt(i)
    End If
Next

这是单行的:

list = list.Where(Function(x) x > 360 AndAlso x <= 720).ToList()

如果您确定列表已排序,您也可以这样做,这可能运行更快:

list = list.
    SkipWhile(Function(x) x <= 360).
    TakeWhile(Function(x) x <= 720).
    ToList()

您的列表似乎已排序,列表支持 RemoveRange

list.RemoveRange(721, list.Count - 721)
list.RemoveRange(0, 360)

如果它不是顺序列表(没有 index:value 的 1:1 映射),您可以使用 IndexOf 找到值的索引,然后基于这些索引的 RemoveRange:

Dim st = list.IndexOf(360)
Dim ed = list.LastIndexOf(720)
list.RemoveRange(ed + 1, list.Count - ed - 1)
list.RemoveRange(0, st)

提出 Linq 的答案与您的有显着差异;您的代码永久性地改变了原始列表; LINQ 不会这样做

综上所述,仅生成一个新范围可能会更有效(基于列表中有 1001 个递增整数并需要 360 - 720 的假设):

Enumerable.Range(360, 361).ToList()