6

.NET 3.5 では、LinkedList クラスを使用していますが、次の問題があります。そのリストの項目が、リスト内の前の項目と次の項目を認識できるようにします。つまり項目内のメソッドでこれ、次、これ、前ができるようにしたい。これは可能ですか?以下は、私がやりたいことの例です。

Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1);
days.AddLast(d2);

// Here is want I would like to do
d1.Next = ...

ありがとう!

4

7 に答える 7

12

まず、継承できないのLinkedListNodeです。sealed

次に、LinkedListNodeプロパティが含まれてPreviousおり、の特定のインスタンスが由来Nextする前のノードと次のノードを参照します。LinkedListLinkedListNode

最後に、AddLast正しく使用するには、次のことを行う必要があります。

Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
LinkedListNode<Day> node1 = days.AddLast(d1);
LinkedListNode<Day> node2 = days.AddLast(d2);

// now node1.Next refers to node containing d2
// and node2.Previous referes to node containing d1
于 2009-08-25T23:23:02.813 に答える
2

あなたはそれを間違って使用しています。

この.AddLast(T)メソッドは、リンクリストノードを返します。これはあなたの日を指し、あなたが探している前と次の機能を持っています。

于 2009-08-25T23:23:16.620 に答える
1

MSDNによると、LinkedListNodeクラスは継承できません。

Michaelは、Eric Lippertからのこのブログ投稿で、フレームワーク内の多くのクラスが封印されている理由について説明していると指摘しています。

于 2009-08-25T23:19:01.480 に答える
0
Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
// Day's instance doesn't have Next. Its the LinkedListNode that should be used.
LinkedListNode<Day> d1Node = days.AddLast(d1); 
days.AddLast(d2);
于 2009-08-25T23:20:56.483 に答える
0

そもそもノードを直接使用しないのはなぜですか...

LinkedListNode<Day> d1 = new LinkedListNode<Day>(new Day());
LinkedListNode<Day> d2 = new LinkedListNode<Day>(new Day());
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1); 
days.AddLast(d2);

// Now you can read the node directly
d1.Next...

// If you need to place it somewhere other than at the end (like say you want d2 before d1,
// but d1 is already in the list) use 'AddBefore' and 'AddAfter' eg:
days.AddLast(d2);
days.AddBefore(d2, d1);
于 2009-08-25T23:30:06.560 に答える
0

Tジェネリックにその兄弟を認識させる唯一の方法は、独自のデータ構造を実装することです。

public interface ILinkedListNode
{
    ILinkedListNode Next { get; set; }
    ILinkedListNode Previous { get; set; }
}

public class LinkedList<T> where T : ILinkedListNode 
{
    /*.... methods here ...*/
}

public class Node : ILinkedListNode
{
    public Node Next { get; set; }

    public Node Previous { get; set; }

    ILinkedListNode ILinkedListNode.Next
    {
        get { return this.Next; }
        set { this.Next = (Node)value; }
    }

    ILinkedListNode ILinkedListNode.Previous
    {
        get { return this.Previous; }
        set { this.Previous = (Node)value; }
    }
}
于 2010-08-19T16:22:51.573 に答える
-1

LinkedListNode はシール クラスであるため、継承できません。IEnumerable に夢中になりすぎて、使用している実際のデータ構造を見失います。これはまだリンクされたリストであるため、次のように扱うことができます。

LinkedListNode<Day> node = days.First();
while (node != null)
{
    Day day = node.Value;

    // do stuff here...

    node = node.Next();
}
于 2009-08-25T23:26:21.013 に答える