2

アプリケーションでいくつかのワークフロー ステップを保持するために汎用リンク リストを使用しようとしています。これが、データベースに永続化する方法です。

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

このデータセットを datareader オブジェクトに戻します。次に、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

Order Id、Workflow Step Id、Weightのようにデータを永続化することはできませんか

次に、最初のアイテムの重量は 0、次の重量は 1、次の重量は 2 です。重いアイテムはリストの最後に沈みます。

最後に、データベースからデータを読み取るときは、データを重み (昇順) で並べ替え、結果から読み取ったときに各項目をリストの最後に追加します。これは、カスタムの find メソッドがまったく必要ないことを意味します。

データベースからステップを直接削除したい場合、このように表現すると作業が簡単になります。現時点では、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 に答える