在.NET中,查找从OBJ文件读入的数组部分的开始索引和结束索引

在.NET中,查找从OBJ文件读入的数组部分的开始索引和结束索引,.net,vb.net,indexof,.net,Vb.net,Indexof,我有一个OBJ文件,可以读入一个对象数组。然后,我使用Array.IndexOf,首先找到我要处理的对象层部分,然后获得该部分中以“vt”开头的行的开始索引和结束索引。我可以得到对象层的适当索引,但其他两个索引显示为-1 这是一个带有一个对象的OBJ的截断版本 o Layer_1_Hull . . . o Layer_2_Mainsail '=== Finds index of specified object layer first, v 13.

我有一个OBJ文件,可以读入一个对象数组。然后,我使用Array.IndexOf,首先找到我要处理的对象层部分,然后获得该部分中以“vt”开头的行的开始索引和结束索引。我可以得到对象层的适当索引,但其他两个索引显示为-1

这是一个带有一个对象的OBJ的截断版本

o Layer_1_Hull
.
.
.
o Layer_2_Mainsail                         '=== Finds index of specified object layer first,
v 13.747500 283.669006 411.285187          '=== Layer_2_Mainsail object layer in this case
v 13.747500 283.669006 411.275177
v 13.797300 283.483002 411.275177
vt 0.900824 0.386317                       '=== Finds index of the first instance of "vt"
vt 0.900895 0.386336
vt 0.871146 0.496693
vt 0.871075 0.496673                       '=== Finds index of the last instance of "vt"
vn -0.9660 -0.2587 0.0000
vn -0.9660 0.2587 0.0000
vn -0.7071 0.7072 0.0000
vn -0.2592 0.9658 0.0000
我使用的代码

    Option Explicit On
    .
    .
    .
    Dim objArray As String() = File.ReadAllLines("C:\Users\Dude\Project\Sailboat.obj")
    Dim layerIndex As Integer = Array.IndexOf(objArray, "o " + "Layer_2_Mainsail")
    Dim uvStartIndex As Integer = Array.IndexOf(objArray, "vt ", layerIndex)       '=== Returns -1, why??
    Dim uvEndIndex As Integer = Array.IndexOf(objArray, "vn ", uvStartIndex) - 1   '=== index out of bounds

感谢您对疑难解答的帮助。

我会这样写:

 Dim lines = File.ReadLines("C:\Users\Dude\Project\Sailboat.obj").
      SkipWhile(Function(line) Not line.StartsWith("o " + "Layer_2_Mainsail")).
      SkipWhile(Function(line) Not line.StartsWith("vt ")).
      TakeWhile(Function(line) Not line.StartsWith("vn "))
请在此处查看它的工作情况(该链接还将显示您可能需要添加的任何
导入
指令):


至于现有代码失败的原因,我怀疑目标文本后面有额外的空格,因此该行与搜索键不完全匹配。

我会这样写:

 Dim lines = File.ReadLines("C:\Users\Dude\Project\Sailboat.obj").
      SkipWhile(Function(line) Not line.StartsWith("o " + "Layer_2_Mainsail")).
      SkipWhile(Function(line) Not line.StartsWith("vt ")).
      TakeWhile(Function(line) Not line.StartsWith("vn "))
请在此处查看它的工作情况(该链接还将显示您可能需要添加的任何
导入
指令):


至于现有代码失败的原因,我怀疑目标文本后面有额外的空格,因此该行与搜索键不完全匹配。

为什么
objArray As Object()
?它应该是
…作为字符串()
。与此相关的是,请确保在上使用显式的
选项。一直都是。不过结果还是一样的,康拉德-1对于uvStartIndex
Array.IndexOf()
搜索字符串的全部内容。部分字符串不匹配。使用
File.ReadLines()
,迭代集合并为每次迭代增加一个整数变量。使用
String.StartsWith()
并存储第一个和最后一个匹配项。为什么
objArray作为对象()
?它应该是
…作为字符串()
。与此相关的是,请确保在
上使用显式的
选项。一直都是。不过结果还是一样的,康拉德-1对于uvStartIndex
Array.IndexOf()
搜索字符串的全部内容。部分字符串不匹配。使用
File.ReadLines()
,迭代集合并为每次迭代增加一个整数变量。使用
String.StartsWith()
并存储第一个和最后一个匹配项。我使用了Array.IndexOf(objArray,Function(x)x.Contains(“vt”),layerIndex),这很有效,但后来我看到了这一点,并且更喜欢它。谢谢。我使用了Array.IndexOf(objArray,Function(x)x.Contains(“vt”),layerIndex))这是有效的,但后来我看到了这一点,并且更喜欢它。非常感谢。