如果有人能回答有关存储和搜索对象集合的一些问题,我将不胜感激。如果您能给出任何建议的基本示例,我将非常感激。
储存:
我正在编写一个需要在Active Directory中搜索计算机对象的应用程序,并且我将它们存储在一组对象中。我想保存计算机对象集合以及下次运行应用程序时未存储在Active Directory中的附加信息(例如计算机的MAC地址)。我还想保存一份OU列表。
到目前为止,这是我的对象集合(它将具有更多属性)。保存系列的最佳方法是什么?最好不使用数据库或保存到文件会对性能产生严重影响吗?
或者有更好的方法来做我下面的事情吗?
Public Class Computer
Public Property Name As String
Public Property FQDN As String
Public Property Path As String
End Class
Public Class ComputerCollection
Inherits Collections.CollectionBase
Public Sub Add(ByVal computer As Computer) 'Adds a new computer object to the collection
List.Add(computer)
End Sub
End Class
搜索:
我有一个类似于ADUC的布局,其中包含OU的树视图和一个显示所选OU中的计算机对象的列表视图。以下代码循环访问计算机对象集合,检查计算机对象的路径是否与选定的OU路径匹配,然后在列表视图中显示它们。
这是性能方面最好的方法吗?还是有更快的方式?
Private Sub tvOU_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles tvOU.AfterSelect
lvComputers.Items.Clear()
If tvOU.SelectedNode.Name > "" Then
For Each computerObj In computers
If computerObj.Path.ToString.Replace("CN=" + computerObj.Name + ",", "") = tvOU.SelectedNode.Name Then
Dim lvItem As New ListViewItem
lvItem.Text = computerObj.Name
lvComputers.Items.Add(lvItem)
End If
Next
Else
Exit Sub
End If
End Sub
答案 0 :(得分:1)
除非有其他未知要求,否则确实需要一个简单的List(Of Computer)
。对于此类事物,使用序列化可以非常简单地保存,对于List
或Collection<T>
也可以使用相同的方法。
Imports System.Collections.ObjectModel
Public Class ComputersCollection
Inherits Collection(Of Computer)
' NOT the crude thing in the VB NameSpace
' there is almost nothing to add: item, add and remove
' are in the base class
' ... perhaps saving and retrieving them by a key (name)
' which may do away with the search procedure in the posted code
End Class
Private Computers As New Collection(Of Computer)
' or
Private Computers As New List(Of Computer)
另一部分,保存您的收藏,可以通过序列化简单。首先,您必须将Serializable属性添加到您的Computer类:
<Serializable>
Public Class Computer
如果您忘记了,则会收到错误Class foobar is not marked as serializable
。保存到磁盘:
Imports System.Runtime.Serialization
Private myComputerFile As String = ...
Dim bf As New BinaryFormatter
Using fs As New FileStream(myComputerFile , FileMode.OpenOrCreate)
bf.Serialize(fs, Computers)
End Using
然后您可以轻松地重新创建列表或集合;这次是List:
' ToDo: add a check to skip if file is not there
' as in the first time run
Dim bf As New BinaryFormatter
Using fs As New FileStream(myComputerFile , FileMode.Open)
Computers = CType(bf.Deserialize(fs), List(Of Computers))
End Using
或者您可以使用XML序列化程序创建XML文件或使用更快,更智能的二进制序列化程序ProtoBuf-Net