在子循环中遍历列表的最佳方法
Best way to loop through a list within a sub-loop
首先,我在发布此问题之前进行了搜索,但答案过于笼统,以至于我找不到与我正在尝试做的类似的内容。如果之前已经回答过但我没有找到,我提前道歉。
我有一个场景,我已经从 SQL 服务器收集了大量的行列表 (>10K) 并将其放入一个字符串数组 (List) 中。这些行由文件名组成。因为我已经将它们放在列表中,所以我不想再次查询 SQL 服务器,而是想使用内存中已有的内容。
这是我试图正确的代码:
'InfoLink1、InfoLink2、InfoLink3 的有效文件类型
Dim lstValidImageFormats As New List(Of String)({".JPG", ".JPEG", ".JPE", ".BMP", ".PNG", ".TIF", ".TIFF", ".GIF"})
Dim lstValidSTLFormats As New List(Of String)({".STL"})
Dim lstValidSTEPFormats As New List(Of String)({".STP", ".STEP"})
'////////////////
'// Components //
'////////////////
'We don't check Parts.InfoLink because all formats are allowed in this field
'Parts.InfoLink1 - File in Infolink1 columns MUST BE images
For i = 0 To arrStrComponentsInfolink1Values.Count - 1 'We have 10K rows with filenames in this list
For Each FileExtension As String In lstValidImageFormats
If arrStrComponentsInfolink1Values.Item(i).EndsWith(FileExtension) = False Then
End If
Next
Next
我正在尝试解析数组 arrStrComponentsInfolink1Values
中的每个项目(文件名)并检查文件名是否不以列表 lstValidImageFormats
中的扩展名之一结尾。如果没有,那么我会将文件名发送到另一个列表(数组)。
我的困难在于如何遍历 arrStrComponentsInfolink1Values
中的每个项目,然后检查每个文件名是否以 lstValidImageFormats
中声明的扩展名之一结尾,做我想做的事情如果它不以其中一个扩展名结尾,则继续解析 arrStrComponentsInfolink1Values
.
中的下一个项目
我真的不知道什么是最有效的way/performance。
我上面的代码是空的,因为在算法上我不知道最好的方法来做我想做的事情而不用像 AND filename NOT LIKE '%.JPG' AND filename NOT LIKE '%.JPEG' AND filename NOT LIKE '%.JPE' AND filename NOT LIKE '%.BMP'...
这样的东西再次查询 SQL 服务器
因为我已经把内存中的数据放在列表里了,如果能用我已有的,性能会好很多。
任何建议或 material 我可以阅读以了解如何做我正在寻找的东西?
谢谢!
我最终这样做了并且成功了:
Dim lstValidImageFormats As New List(Of String)({".JPG", ".JPEG", ".JPE", ".BMP", ".PNG", ".TIF", ".TIFF", ".GIF"})
Dim lstValidSTLFormats As New List(Of String)({".STL"})
Dim lstValidSTEPFormats As New List(Of String)({".STP", ".STEP"})
'////////////////
'// Components //
'////////////////
'We don't check Parts.InfoLink because all formats are allowed in this field
'Parts.InfoLink1 - File in Infolink1 columns MUST BE images
Dim intExtCounter As Integer = 0
For i = 0 To arrIntComponentsInfolink1UNRs.Count - 1 'We have 10K rows with filenames in this list
intExtCounter = 0
For j = 0 To lstValidImageFormats.Count - 1
If arrStrComponentsInfolink1Values.Item(i).EndsWith(lstValidImageFormats.Item(j)) = True Then
intExtCounter += 1
End If
Next
If intExtCounter = 0 Then 'At least one file extension was found
arrIntComponentsInfolink1UNRsReportSectionInvalidExtensions.Add(i) 'File extension is not in the list of allowed extensions
End If
Next
但是@41686d6564 的回答是最好的解决方案:
Dim newList = arrStrComponentsInfolink1Values.Where(Function(x) Not lstValidImageFormats.Contains(IO.Path.GetExtension(x))).ToList()
谢谢!
以下是我将如何解决这个问题:
Dim invalidFormatFiles = _
From x In arrStrComponentsInfolink1Values _
Let fi = New FileInfo(x) _
Where Not lstValidImageFormats.Contains(fi.Extension.ToUpperInvariant()) _
Select x
For Each invalidFormatFile In invalidFormatFiles
' Do your processing
Next
首先,我在发布此问题之前进行了搜索,但答案过于笼统,以至于我找不到与我正在尝试做的类似的内容。如果之前已经回答过但我没有找到,我提前道歉。
我有一个场景,我已经从 SQL 服务器收集了大量的行列表 (>10K) 并将其放入一个字符串数组 (List) 中。这些行由文件名组成。因为我已经将它们放在列表中,所以我不想再次查询 SQL 服务器,而是想使用内存中已有的内容。
这是我试图正确的代码:
'InfoLink1、InfoLink2、InfoLink3 的有效文件类型
Dim lstValidImageFormats As New List(Of String)({".JPG", ".JPEG", ".JPE", ".BMP", ".PNG", ".TIF", ".TIFF", ".GIF"})
Dim lstValidSTLFormats As New List(Of String)({".STL"})
Dim lstValidSTEPFormats As New List(Of String)({".STP", ".STEP"})
'////////////////
'// Components //
'////////////////
'We don't check Parts.InfoLink because all formats are allowed in this field
'Parts.InfoLink1 - File in Infolink1 columns MUST BE images
For i = 0 To arrStrComponentsInfolink1Values.Count - 1 'We have 10K rows with filenames in this list
For Each FileExtension As String In lstValidImageFormats
If arrStrComponentsInfolink1Values.Item(i).EndsWith(FileExtension) = False Then
End If
Next
Next
我正在尝试解析数组 arrStrComponentsInfolink1Values
中的每个项目(文件名)并检查文件名是否不以列表 lstValidImageFormats
中的扩展名之一结尾。如果没有,那么我会将文件名发送到另一个列表(数组)。
我的困难在于如何遍历 arrStrComponentsInfolink1Values
中的每个项目,然后检查每个文件名是否以 lstValidImageFormats
中声明的扩展名之一结尾,做我想做的事情如果它不以其中一个扩展名结尾,则继续解析 arrStrComponentsInfolink1Values
.
我真的不知道什么是最有效的way/performance。
我上面的代码是空的,因为在算法上我不知道最好的方法来做我想做的事情而不用像 AND filename NOT LIKE '%.JPG' AND filename NOT LIKE '%.JPEG' AND filename NOT LIKE '%.JPE' AND filename NOT LIKE '%.BMP'...
因为我已经把内存中的数据放在列表里了,如果能用我已有的,性能会好很多。
任何建议或 material 我可以阅读以了解如何做我正在寻找的东西?
谢谢!
我最终这样做了并且成功了:
Dim lstValidImageFormats As New List(Of String)({".JPG", ".JPEG", ".JPE", ".BMP", ".PNG", ".TIF", ".TIFF", ".GIF"})
Dim lstValidSTLFormats As New List(Of String)({".STL"})
Dim lstValidSTEPFormats As New List(Of String)({".STP", ".STEP"})
'////////////////
'// Components //
'////////////////
'We don't check Parts.InfoLink because all formats are allowed in this field
'Parts.InfoLink1 - File in Infolink1 columns MUST BE images
Dim intExtCounter As Integer = 0
For i = 0 To arrIntComponentsInfolink1UNRs.Count - 1 'We have 10K rows with filenames in this list
intExtCounter = 0
For j = 0 To lstValidImageFormats.Count - 1
If arrStrComponentsInfolink1Values.Item(i).EndsWith(lstValidImageFormats.Item(j)) = True Then
intExtCounter += 1
End If
Next
If intExtCounter = 0 Then 'At least one file extension was found
arrIntComponentsInfolink1UNRsReportSectionInvalidExtensions.Add(i) 'File extension is not in the list of allowed extensions
End If
Next
但是@41686d6564 的回答是最好的解决方案:
Dim newList = arrStrComponentsInfolink1Values.Where(Function(x) Not lstValidImageFormats.Contains(IO.Path.GetExtension(x))).ToList()
谢谢!
以下是我将如何解决这个问题:
Dim invalidFormatFiles = _
From x In arrStrComponentsInfolink1Values _
Let fi = New FileInfo(x) _
Where Not lstValidImageFormats.Contains(fi.Extension.ToUpperInvariant()) _
Select x
For Each invalidFormatFile In invalidFormatFiles
' Do your processing
Next