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

时间:2013-09-11 23:40:04

标签: .net vb.net collections

我一直在使用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专家会推荐哪些收藏?

3 个答案:

答案 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 );