2010-06-07 86 views
1

我有一些代码可以创建用户所属的AD组列表,其目的是说'if user是GroupX的成员,然后允许管理员访问,如果不允许基本访问'。VB.NET - 在ArrayList,StringCollection或List(字符串)中查找子串

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

我想很容易确定一个特定的子字符串(即'GroupX')是否出现在组列表中。我总是可以通过组遍历检查每个代表我的AD组名称的子字符串,但我更感兴趣的是了解是否有更好的方法。

很明显,有许多存储库用于组列表,并且看起来泛型(List(Of String))更常用(我可能很容易实现),但是没有内置的方法来检查子字符串使用这种方法。

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

结果:

我已经定居在使用列表(),并且我从丹的代码借来通过列表进行迭代。

回答

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

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

+0

+1为灵活的解决方案,公司。代码示例(始终欢迎)。 – CJM 2010-06-07 14:08:57

1

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

+0

这就是我在此期间所做的事情,这不是什么大问题......但我只是对替代品感到好奇,如果有的话 - 你不能有太多的选择! – CJM 2010-06-07 10:58:30

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