【问题标题】:How do I create a Generic Linked List?如何创建通用链接列表?
【发布时间】:2008-11-18 20:04:46
【问题描述】:

我正在尝试使用通用链接列表在我的应用程序中保存一些工作流步骤。这是我将它持久化到我的数据库的方式。

OrderID  WorkFlowStepID  ParentWorkFlowStepID
178373    1                        NULL
178373    2                        1
178373    3                        2

我将这个数据集返回到一个 datareader 对象中。然后,我遍历数据读取器并创建一个包含 WorkFlowStepID 属性和 ParentWorkFlowStepID 属性的 WorkFlowStep 对象。我使用 .AddFirst() 方法将第一个对象添加到我的 LinkedList 中。我的下一个想法是创建下一个对象,然后将其插入到 LinkedList 中的对象之后,其中它的 WorkFlowStepID 等于新对象的 ParentWorkFlowStepID。我无法在 LinkedList 中找到对象。 find() 方法要求一个值,但我不明白它是什么值,或者我如何找到它。

【问题讨论】:

    标签: .net generics c#-3.0 list linked-list


    【解决方案1】:

    那么你的意思是你正在使用linked list class in the framework

    如果是这样,Find 方法并没有真正做到你想要的。基本上你想要一个带有谓词的版本。如果该类公开了LinkedListNode<T> 的迭代器,这将更容易。幸运的是,很容易提供一个扩展方法来做到这一点:

    public static IEnumerable<LinkedListNode<T>> GetNodes<T>(this LinkedList<T> list)
    {
        LinkedListNode<T> current = list.First;
        while (current != null)
        {
            yield return current;
            current = current.Next;
        }
    }
    

    那么你可以这样做(我强调所有这些都是未经测试的):

    var node = list.GetNodes().FirstOrDefault(x.Value.WorkFlowerStepID = parentWorkFlowStepID);
    if (node != null)
    {
        list.AddAfter(node, newItem);
    }
    else
    {
        // Whatever. Add to tail?
    }
    

    【讨论】:

      【解决方案2】:

      难道不能像这样持久化你的数据吗 订单 ID、工作流程步骤 ID、重量

      那么第一个项目的权重为 0,下一个权重为 1,下一个权重为 2。重的项目沉入列表的末尾。

      最后,当您从数据库中读取数据时,您只需按重量排序(升序),然后在从结果中读取数据时将每个项目添加到列表的末尾。这意味着您根本不需要自定义 find 方法。

      如果您想直接从数据库中删除一个步骤,以这种方式表示它会使工作变得更简单,因为现在可以通过删除 WorkFlowStepID 2 来破坏您的数据库架构。然后项目 3 没有要附加到的父项目。

      【讨论】:

        【解决方案3】:

        如果输出是一棵退化的树(即一个节点总是有 1 个子节点),您可以拥有一个指向最后一个节点的链表并继续将子节点添加到最后一个节点。

        【讨论】:

          【解决方案4】:

          定义一个比较函数,然后调用 list .Sort() 方法,比较函数作为委托传入。该函数应该接受 2 个对象(例如 X 和 Y),如果 X 大于 Y,则返回 -1,如果它们相等则返回 0,如果 Y 大于 X,则返回 1。

          【讨论】:

          • LinkedList 没有排序方法。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-31
          • 1970-01-01
          • 1970-01-01
          • 2017-11-28
          • 2017-08-19
          相关资源
          最近更新 更多