在进入问题的具体细节之前,让我提供一些细节来解释我想要完成的事情.
我有两个数据源 - 一个是包含部件号,描述等的SQL Server.另一个是没有传统意义上的数据库的CAD系统.我要做的是从SQL Server中读出材料清单并将其与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 ...
Run Code Online (Sandbox Code Playgroud)
编辑:
1)是的,如果你的密钥(这里,部件号)是一个字符串,那么将使用一个字典(Of String,...).
2)我假设你有一个名为Part的类,其中包含一些关于零件的信息.如果您只有部件号而没有其他信息,那么您可以改为创建一个Hashset.它基本上与字典相同,但是使用这种结构,值也是你的关键.您将创建一个这样的哈希集:
Dim cadParts As New Hashset(Of String)
Run Code Online (Sandbox Code Playgroud)
我不会通过代码示例,因为它非常接近Dictionary.ContainsKey变为Contains,Add只接受一个参数(这里是你的部件号).
3)是的,循环遍历它们并将它们添加到hashset.
| 归档时间: |
|
| 查看次数: |
4494 次 |
| 最近记录: |