我一直在使用VB.net(非常旧的版本)很长一段时间,但在过去的7到8年里没有。我有VS 2012和.net 4.5,显然他们已经添加了一个令人眼花缭乱的阵列(没有双关语)的集合。我已经在网上阅读和阅读,但我比以前更加困惑。
我想了解一下使用什么类型的集合的建议。
我有CAD实体: 句柄(最多16个字符的十六进制文本字符串) 起点(具有X,Y和Z坐标的自定义对象) (可选)一个终点(具有X,Y和Z坐标的自定义对象)
出于我的目的,我希望能够检索(并删除)共享某个句柄或某个起点或终点的所有实体:
if handle = 345 OR
if point = start point OR
if point = end point
我希望有多达几千个实体,并将“链接”它们。链接的意思是然后在一个“链”端到端组装。我最终会得到一对多的实体片段,形成一个链条。
我有一个逻辑,只传递一次实体集合,并产生链式结果。它取决于使用上述标准进行的发现。
编辑...极其简化的实际数据可能如下所示:
Handle: 110
Start point x: 23.17
Start point y: 18.29
End point x: 32.5
End point y: 30.72
Handle: 111
Start point x: 40.12
Start point y: 18.32
Handle: 112
Start point x: 40.12
Start point y: 40.12
End point x: 100.1
End point y: 83.2
Handle: 113
Start point x: 40.12
Start point y: 18.32
End point x: 32.5
End point y: 30.72
这些最终将按此顺序链接:
Handle: 110
Start point x: 23.17
Start point y: 18.29
End point x: 32.5
End point y: 30.72
Handle: 113
Start point x: 40.12
Start point y: 18.32
End point x: 32.5
End point y: 30.72
Handle: 111
Start point x: 40.12
Start point y: 18.32
Handle: 112
Start point x: 40.12
Start point y: 40.12
End point x: 100.1
End point y: 83.2
vb.net专家会推荐哪些收藏?
答案 0 :(得分:2)
这实际上取决于您删除实体的频率。如果你只谈论几千个实体并且你不会每秒进行数百次大量删除,那么一个简单的LinkedList(Of Entity)就很容易了。那就是你的“链条”。
要删除符合条件的项目(我的代码是C#,但您可以轻松地将其翻译出来):
chain = new LinkedList<Entity>();
// some code populates the linked list.
// now, to delete
LinkedListNode<Entity> node = chain.First;
while (node != null)
{
LinkedListNode<Entity> nextNode = node.Next;
if (node.Value.handle = searchHandle ||
node.Value.startPoint.Equals(searchStartPoint) ||
node.Value.endPoint.Equals(searchEndPoint)
{
// remove the node
chain.Remove(node);
}
node = nextNode;
}
您可以使用List(Of Entity)
执行此操作,但删除会比将项目插入链中间要慢得多。
答案 1 :(得分:0)
我使用的字典具有覆盖GetHashCode
的自定义键类型,其中结果取决于句柄或点坐标的值。我还添加了一个值包装类,它充当链接列表,其中包含对链中下一个元素的引用。
答案 2 :(得分:0)
我认为你可以使用List(Of T)。
例如:
List(Of MyCADEntry) listEntries = new List( Of MyCADEntry )();
然后使用LINQ来完成
之类的事情listEntries.Where( Function(x) x.StartPoint == point );