Как мне создать общий связанный список? - PullRequest
2 голосов
/ 18 ноября 2008

Я пытаюсь использовать общий связанный список для хранения некоторых шагов WorkFlow в моем приложении. Вот как я сохраняю это в своей базе данных.

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

Я получаю этот набор данных обратно в объект чтения данных. Затем я зацикливаюсь на устройстве чтения данных и создаю объект WorkFlowStep, который включает свойство WorkFlowStepID и свойство ParentWorkFlowStepID. Я добавляю первый объект в свой LinkedList с помощью метода .AddFirst (). Моя следующая идея - создать следующий объект, а затем вставить его после объекта в LinkedList, где его WorkFlowStepID равен ParentWorkFlowStepID нового объекта. Я не могу понять, чтобы найти объект в LinkedList. Метод find () запрашивает значение, но я не понимаю, какое это значение или как его найти.

Ответы [ 4 ]

4 голосов
/ 18 ноября 2008

То есть, вы используете класс связанного списка в рамках ?

Если это так, метод 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 голос
/ 19 ноября 2008

Если выходные данные представляют собой вырожденное дерево (т. Е. Для узла всегда есть 1 дочерний элемент), вы можете иметь связанный список со ссылкой на последний узел и продолжать добавлять дочерний элемент в последний узел.

1 голос
/ 18 ноября 2008

Разве невозможно сохранить ваши данные так Идентификатор заказа, Идентификатор шага рабочего процесса, Вес

Тогда первый предмет имеет вес 0, следующий вес 1, следующий вес 2. Тяжелые предметы опускаются до конца вашего списка.

Наконец, когда вы читаете данные из базы данных, вы просто упорядочиваете их по весу (по возрастанию), а затем добавляете каждый элемент в конец списка, когда читаете его из результата. Это означает, что вам вообще не нужен пользовательский метод поиска.

Такое представление упрощает жизнь, если вы хотите удалить шаг непосредственно из базы данных, поскольку прямо сейчас можно нарушить схему базы данных, удалив WorkFlowStepID 2. У элемента 3 нет родительского элемента, к которому можно присоединиться.

0 голосов
/ 18 ноября 2008

Определите функцию сравнения, а затем вызовите метод list .Sort () с функцией сравнения, переданной в качестве делегата. Функция должна принимать 2 объекта (например, X и Y) и возвращать -1, если X больше, чем Y, 0, если они равны, или 1, если Y больше, чем X.

...