【问题标题】:which collection type to use in .NET 4.5?在 .NET 4.5 中使用哪种集合类型?
【发布时间】:2013-09-11 23:40:03
【问题描述】:

我使用 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 专家会推荐哪些合集?

【问题讨论】:

  • 集合是 .NET 并且不特定于 VB

标签: .net vb.net collections


【解决方案1】:

这实际上取决于您删除实体的频率。如果您只谈论几千个实体并且您不会每秒进行数百次大规模删除,那么简单的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) 执行此操作,但删除会慢得多,因为将项目插入到链的中间。

【讨论】:

  • 链表正是我存储排序实体所需要的。谢谢!
【解决方案2】:

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

【讨论】:

  • “我还要添加一个值包装类,它充当链接列表,其中包含对链中下一个元素的引用。” - 不知道你在这里是什么意思?我打算创建一个具有两个属性的类:前一个实体和下一个实体。是这个意思吗?
  • 你描述的是一个链表,是的。
  • 另外,感谢您的快速回复。我研究了覆盖 GetHashCode 的自定义键类型
  • 我不太明白如何使用句柄或第一个点或第二个点在同一个键中创建唯一键。好像我需要三个不同的钥匙???
【解决方案3】:

我认为你可以只使用 List(Of T)。

例如:

List(Of MyCADEntry) listEntries = new List( Of MyCADEntry )();

然后将 LINQ 用于类似的事情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多