Vb.net 在列表框或列表(字符串)中仅保留父目录

Vb.net 在列表框或列表(字符串)中仅保留父目录,vb.net,linq,list,listbox,Vb.net,Linq,List,Listbox,我有一个包含目录和路径列表的列表框。我希望删除列表中存在的每个子文件夹,并仅保留其父文件夹也存在于列表中 原始清单: 最后名单: 例如,我尝试: Folders_List_In_Listbox = ListBox1.Items.Cast(Of String)().ToList() For Each Fold In Folders_List_In_Listbox Select Case True Case Path.GetFullPath(Fold

我有一个包含目录和路径列表的列表框。我希望删除列表中存在的每个子文件夹,并仅保留其父文件夹也存在于列表中

原始清单:

最后名单:

例如,我尝试:

Folders_List_In_Listbox = ListBox1.Items.Cast(Of String)().ToList()

    For Each Fold In Folders_List_In_Listbox
        Select Case True
            Case Path.GetFullPath(Fold).StartsWith(Path.GetFullPath(Mon_Repertoire))
                Folders_List_In_Listbox.Remove(Fold)
            Case Path.GetFullPath(Mon_Repertoire).StartsWith(Path.GetFullPath(Fold))
                Folders_List_In_Listbox_To_Remove.Add(Repertoire)
        End Select
    Next

ListBox1.DataSource = Folders_List_In_Listbox
如果我们的目录列在一个列表框或一个字符串列表中,我们怎么做呢

谢谢

我创建了一个代码来解决我的问题:


请告诉我们你试过什么。我真的不明白你是如何从原始列表到最终列表的。我同意itsme86,我看不出你试图完成的事情有任何逻辑。@itsme86我已经更新了我的问题。@VisualEvent我在我的示例中没有看到任何不合逻辑的事情。如果我的列表中有D:\Folder\u 1和D:\Folder\u 1\Folder\u 98\Folder3,我希望保留第一个文件夹,并从列表中删除第二个文件夹。非逻辑的事情之一是,例如,完全删除文件夹\u 4。另一种方法是删除D:\Folder\u 1\Folder\u 98,但保留D:\Folder\u 2\Folder\u 8。自动执行这项任务很难,甚至几乎不可能。-编辑:我刚才看到的第三件不合逻辑的事情是,您还删除了整个D:\Folder\u 2\Folder\u 8\Folder\u 1\Folder\u 112\.啊。抱歉没有早点回来,出了点事。这与我会做的类似,但是我会对列表进行排序并手动迭代每个项目。两个小改进提示:1您应该使用AndAlso而不是and,因为AndAlso短路,因此如果左侧大小计算为False,则不会计算右侧。2您可能应该就正在比较的字符串调用ToLower。这是因为本地文件系统路径不区分大小写,并且使用您当前的代码D:\Folder\u 1将与D:\Folder\u 1不同。下面是如何考虑大小写不区分的方法:Path.GetFullPathMon\u Repertoire.ToLower.StartsWithPath.GetFullPathX.ToLower.@visualincent谢谢您的提示。我将改进我的代码。但我不明白为什么要对列表进行排序。@VisualIncent如果可以的话,我很高兴您能给我看一下您的代码。否则无论如何谢谢你。
D:\Folder_1
D:\Folder_2\Folder_8
D:\Folder_3\Folder_5
D:\Folder_3\Folder_9
D:\Folder_3\Folder_1
E:\
F:\
H:\
Folders_List_In_Listbox = ListBox1.Items.Cast(Of String)().ToList()

    For Each Fold In Folders_List_In_Listbox
        Select Case True
            Case Path.GetFullPath(Fold).StartsWith(Path.GetFullPath(Mon_Repertoire))
                Folders_List_In_Listbox.Remove(Fold)
            Case Path.GetFullPath(Mon_Repertoire).StartsWith(Path.GetFullPath(Fold))
                Folders_List_In_Listbox_To_Remove.Add(Repertoire)
        End Select
    Next

ListBox1.DataSource = Folders_List_In_Listbox
Dim List1 As List(Of String) = ListBox1.Items.Cast(Of String)().ToList()
Dim List2 As List(Of String) = ListBox1.Items.Cast(Of String)().ToList(

For Each Mon_Repertoire In List1
    If List2.Any(Function(X) Path.GetFullPath(Mon_Repertoire).StartsWith(Path.GetFullPath(X)) _
                 And Path.GetFullPath(X).Length <> Path.GetFullPath(Mon_Repertoire).Length) Then
        List2.Remove(Mon_Repertoire)
    End If
Next

ListBox1.DataSource = Nothing
ListBox1.DataSource = List2