在子循环中遍历列表的最佳方法

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