Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET 4.5中使用哪种集合类型?_.net_Vb.net_Collections - Fatal编程技术网

在.NET 4.5中使用哪种集合类型?

在.NET 4.5中使用哪种集合类型?,.net,vb.net,collections,.net,Vb.net,Collections,我已经使用VB.net(非常旧的版本)很长一段时间了,但在过去的7-8年里没有。我有VS 2012和.net 4.5,很明显,他们增加了令人眼花缭乱的集合(没有双关语)。我在网上读了又读,但我真的比以前更困惑了 我想就使用哪种类型的收藏提出一些建议 我拥有以下CAD实体: 句柄(最多16个字符的十六进制文本字符串) 起点(具有X、Y和Z坐标的自定义对象) (可选)终点(具有X、Y和Z坐标的自定义对象) 出于我在这里的目的,我希望能够检索(和删除)共享某个句柄或某个起点或终点的所有实体: if h

我已经使用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专家会推荐什么集合?

我会使用一个自定义键类型的字典,它覆盖
GetHashCode
,结果取决于句柄或点坐标的值。我还将添加一个值包装器类,该类充当链接列表,其中包含对链中下一个元素的引用。

我认为您可以使用list(Of T)

例如:

List(Of MyCADEntry) listEntries = new List( Of MyCADEntry )();
然后使用LINQ进行如下操作

listEntries.Where( Function(x) x.StartPoint == point );

这实际上取决于删除实体的频率。如果你说的只是几千个实体,而不是每秒数百次的大规模删除,那么一个简单的方法真的很容易。这就是你的“锁链”

要删除符合条件的项目(我的代码是C#,但您可能很容易翻译):

chain=newlinkedlist();
//有些代码填充链表。
//现在,删除
LinkedListNode节点=链;
while(节点!=null)
{
LinkedListNode nextNode=node.Next;
if(node.Value.handle=searchHandle||
node.Value.startPoint.Equals(searchStartPoint)||
node.Value.endPoint.Equals(searchEndPoint)
{
//删除节点
链。移除(节点);
}
node=nextNode;
}

您可以使用
列表(实体)
来完成此操作,但是删除要比将项目插入链中间慢得多。

“我还需要添加一个值包装类,该类充当链接列表,其中包含对链中下一个元素的引用。”-不知道你在这里是什么意思?我要创建一个具有两个属性的类:前一个实体和下一个实体。这就是你的意思吗?你描述的是一个链表,是的。另外,感谢你的快速回复。我研究了覆盖GetHashCode的自定义键类型。我不太明白如何使用句柄或fir生成唯一键st点或第二点都在同一个键中。就像我需要三个不同的键一样???集合是.NET,而不是特定于VBA链接列表,这正是我需要存储排序实体的地方。谢谢!
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;
}