代码之家  ›  专栏  ›  技术社区  ›  CJM

在arraylist、stringcollection或list(字符串)中查找子字符串

  •  1
  • CJM  · 技术社区  · 15 年前

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

    我正使用StringCollection存储此组列表,并打算使用包含方法测试我的管理组的成员身份,但问题是此方法只比较完整的字符串,但我的AD组值的格式为 cn=GroupX, etc... .

    我希望能够轻松地确定特定的子字符串(即“groupx”)是否出现在组列表中。我总是可以通过组迭代,检查每个组是否有代表我的广告组名的子字符串,但我更感兴趣的是找出是否有更好的方法。

    显然,对于组列表有许多存储库,而且似乎泛型( List(Of String) )是更常见的首选(无论如何我都可以很好地实现),但也没有使用此方法检查子字符串的内置方法。

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

    结果:

    我已经决定使用一个(的)列表,并且我借用了丹的代码来遍历这个列表。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Dan Tao    15 年前

    我认为您不会找到比枚举集合*更好的方法。

    也就是说,这里有一个独立于收集类型的好方法:

    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
    

    这是解决“要使用哪个集合”的好方法。发布,因为基本上所有集合,通用或非通用( ArrayList , List(Of String) 等),实施 IEnumerable .

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

        2
  •  1
  •   Nimesh Madhavan    15 年前

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

        3
  •  0
  •   SharpAffair    15 年前

    您可以使用谓词函数。这是一个布尔函数,可以帮助您筛选出一些条目。

    例如,要从列表中获取非隐藏文件,请执行以下操作:

    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