如何创建通用链接列表?

时间:2008-11-18 20:04:47

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

我正在尝试使用通用链接列表在我的应用程序中保存一些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()方法要求一个值,但我不明白它是什么值,或者我如何找到它。

4 个答案:

答案 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.