我正在尝试使用通用链接列表在我的应用程序中保存一些WorkFlow步骤。以下是我如何将其保存到我的数据库中。
的OrderID WorkFlowStepID ParentWorkFlowStepID
178373 1 NULL
178373个2 1
178373个3 2
我将这个数据集放回到datareader对象中。然后我循环遍历datareader并创建一个WorkFlowStep对象,该对象包含WorkFlowStepID属性和ParentWorkFlowStepID属性。我使用.AddFirst()方法将第一个对象添加到LinkedList。我的下一个想法是创建下一个对象,然后将它插入到LinkedList中的对象之后,其中WorkFlowStepID等于新对象的ParentWorkFlowStepID。我无法想象在LinkedList中找到对象。 find()方法要求一个值,但我不明白它是什么值,或者我如何找到它。
答案 0 :(得分:4)
那你的意思是说你正在使用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?
}
答案 1 :(得分:1)
是不是可以像这样持久存储您的数据 订单ID,工作流程步骤ID,权重
然后第一个项目的权重为0,下一个权重为1,下一个权重为2.重的项目会下沉到列表的末尾。
最后,当您从数据库中读取数据时,您只需按重量(升序)对其进行排序,然后在从结果中读取时将每个项目添加到列表的末尾。这意味着您根本不需要自定义查找方法。
如果要直接从数据库中删除步骤,以这种方式表示会使生活更简单,因为现在可以通过删除WorkFlowStepID来破坏数据库模式2.项目3则没有要附加的父项。< / p>
答案 2 :(得分:1)
如果输出是退化树(即节点总是有1个子节点),则可以使用带有对最后一个节点的引用的链表,并继续将子节点添加到最后一个节点。
答案 3 :(得分:0)
定义一个比较函数,然后使用作为委托传入的比较函数调用列表.Sort()方法。该函数应该有2个对象(例如X和Y),如果X大于Y,则返回-1;如果它们相等则返回0;如果Y大于X,则返回1.