VB.NET - 在ArrayList,StringCollection或List(Of String)中查找子字符串

时间:2010-06-07 09:59:54

标签: vb.net generics collections substring

我有一些代码可以创建用户所属的AD组列表,目的是说“如果用户是GroupX的成员,那么允许管理员访问,如果不允许基本访问”。 / p>

我使用StringCollection来存储这个Group列表,并打算使用Contains方法来测试我的admin组的成员身份,但问题是这个方法只比较完整的字符串 - 但我的AD组值是格式为cn=GroupX, etc...

我希望能够轻松确定特定子字符串(即“GroupX”)是否出现在组列表中。我总是可以遍历各组,检查每个组中是否有代表我的AD组名的子字符串,但我更感兴趣的是找出是否有“更好”的方式。

显然,组列表中有许多存储库,看起来Generics(List(Of String))更常用(我可能无论如何都可以实现)但是没有内置的检查方法对于使用此方法的子字符串。

有什么建议吗?或者我应该只是遍历组列表?

结果:

我已经决定使用List(Of),并且我从Dan的代码中借用了迭代列表。

3 个答案:

答案 0 :(得分:2)

我认为你不会找到一个更好的方法而不是枚举集合*。

那就是说,这是一个很好的方式,它将独立于集合类型:

Public Function ContainsSubstring(ByVal objects As IEnumerable, ByVal substring As String) As Boolean
    Dim strings = objects.OfType(Of String)()
    For Each str As String in strings
        If str.Contains(substring) Then Return True
    Next

    Return False
End Function

这是解决“使用哪个集合?”的好方法。问题,因为基本上所有集合,通用或非通用(ArrayListList(Of String)等),实施IEnumerable

*为什么我相信即将到来的理由。

答案 1 :(得分:1)

编写一个辅助函数,它将遍历检查子字符串的项目并返回一个布尔标志似乎是你最好的选择。

答案 2 :(得分:0)

您可以使用谓词函数。它是一个布尔函数,可以帮助您过滤掉一些条目。

例如,要从列表中获取非隐藏文件:

Public ReadOnly Property NotHiddenFiles As List(Of FileInfo)

    Get
        Dim filesDirInfo As New DirectoryInfo(FileStorageDirectory)
        Return filesDirInfo.GetFiles.ToList.FindAll(AddressOf NotHiddenPredicate)
    End Get

End Property



Private Function NotHiddenPredicate(ByVal f As FileInfo) As Boolean

    Return Not ((f.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden)

End Function