从 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()
我有一个列表
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()