2

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

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

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

4

4 回答 4

4

那么你的意思是你在框架中使用链表类吗?

如果是这样,该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?
}
于 2008-11-18T20:13:15.347 回答
1

是否可以像订单 ID、工作流程步骤 ID、重量一样持久化您的数据

然后第一个项目的重量为 0,下一个重量为 1,下一个重量为 2。重的项目沉到列表的末尾。

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

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

于 2008-11-18T20:45:54.237 回答
1

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

于 2008-11-18T21:01:31.773 回答
0

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

于 2008-11-18T20:17:18.913 回答