在深入研究问题的细节之前,让我提供一些细节来解释我要完成的工作。
我有两个数据源 - 一个是包含零件号、描述等的 SQL Server。另一个是没有传统意义上的数据库的 CAD 系统。我要做的是从 SQL Server 中读出 Material list ,并将其与 CAD 装配图进行比较,以确保 CAD 系统包含与 SQL Server 相同的信息。
从 SQL Server 获取数据相当简单。我查询数据库并填充数据网格。完毕。快的。简单的。
从 CAD 系统获取数据的过程稍微复杂一些。我必须加载装配图以获取所有组件零件的列表,然后加载这些单独的图纸以从图纸中提取“零件编号”属性。这是一个有点耗时且缓慢的过程(不幸的是),因为实际上必须访问每个文件。我将这些属性加载到一个数组中(我猜列表可能更有效)。
所以现在我有一个带有零件号的数据网格和数组。我需要比较它们并相应地为网格着色。如果零件在两者中都存在,则网格应保持透明,如果仅存在于网格中,则将行着色为黄色,如果仅存在于阵列中,则添加着色为红色的行。
据我所知,这意味着在网格的每一行上循环遍历数组。思考过程是这样的:
这种逻辑的问题在于,从性能的角度来看,它似乎很昂贵。当然有更好的方法吗?此外,如果我以某种方式(如度假村)修改网格,我必须再次完成该过程。我真的很感激这方面的一些建议。
谢谢!
注意:用 Visual Studio 2005 编写。
最佳答案
您可以将 CAD 系统中的数据加载到字典中(按零件编号索引)。然后你可以遍历网格并检查它是否存在于字典中,这是一个快速操作( O(1) )。你可以完全按照你说的做,删除字典中找到的元素并在数据网格中添加剩余的元素。
下面是一些用于创建和使用字典的代码(使用 C# 样式注释来保留格式):
//First argument is your key type, second is your item type
Dim cadParts As New Dictionary(Of Integer, Part)
//Add items to the parts dictionary
For Each part As Part In cadPartsArray
cadParts.Add(part.PartNumber,part)
Next
//Check if a part exists
Dim partNumber As Integer = 12345
If cadParts.ContainsKey(partNumber) ...
//Remove a part
cadParts.Remove(partNumber)
//Go through the remaining values
For Each part As Part In cadParts.Values ...
编辑:
1) 是的,如果您的 key (此处为零件编号)是字符串,则将使用 Dictionary(Of String,...)。
2) 我假设您有一个名为 Part 的类,其中包含有关零件的一些信息。如果您只有一个零件号,而没有其他信息,那么您可以创建一个 Hashset。它与字典基本相同,但使用这种结构,值也是您的键。您将创建一个这样的哈希集:
Dim cadParts As New Hashset(Of String)
我不会通过代码示例,因为它非常接近字典。 containsKey 变为 contains,而 Add 仅接受一个参数(此处为您的部件号)。
3)是的,遍历它们并将它们添加到哈希集。
关于sql - 比较 VB.NET 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888020/