1

リンクリストを C# の循環リンク リストのように動作させる簡単な方法を作成しようとしています。

私はこのコードを持っていますが、拡張メソッドとして表示したくありません。理由はありますか?

static class CircularLinkedList
{
    public static LinkedListNode<object> NextOrFirst(this LinkedListNode<object> current)
    {
        if (current.Next == null)
            return current.List.First;
        return current.Next;
    }

    public static LinkedListNode<object> PreviousOrLast(this LinkedListNode<object> current)
    {
        if (current.Previous == null)
            return current.List.Last;
        return current.Previous;
    }
}
4

3 に答える 3

3
  1. この拡張クラスの名前空間を、使用しているコードに必ず追加してください
  2. デフォルトではクラスは内部であるため、別のプロジェクトからこの拡張メソッドを使用している場合は、クラスをパブリックとしてマークします。
  3. LInkedListNode<T>代わりに使用する方が良いでしょうLinkedListNode<object>

コード。

public static class CircularLinkedList
{
    public static LinkedListNode<T> NextOrFirst<T>(this LinkedListNode<T> current)
    {
        if (current.Next == null)
            return current.List.First;
        return current.Next;
    }

    public static LinkedListNode<T> PreviousOrLast<T>(this LinkedListNode<T> current)
    {
        if (current.Previous == null)
            return current.List.Last;
        return current.Previous;
    }
}
于 2013-01-12T07:45:26.867 に答える
2

publicクラスで指定する必要があります。拡張クラスが別のプロジェクトにある場合、クラスは内部的であり、おそらく拡張メソッドにアクセスできないためです。

public static class CircularLinkedList
{
.....
}

後でアクセスするには、次のように使用します。

LinkedListNode<object> obj = new LinkedListNode<object>(null);
obj.PreviousOrLast();
于 2013-01-12T07:41:59.953 に答える
1

これは、次のアプリケーションでうまく機能します。

class Program
{
    static void Main(string[] args)
    {
        LinkedListNode<object> node = new LinkedListNode<object>("Hello World");
        node.NextOrFirst();
    }
}

static class CircularLinkedList
{
    public static LinkedListNode<object> NextOrFirst(this LinkedListNode<object> current)
    {
        if (current.Next == null)
            return current.List.First;
        return current.Next;
    }

    public static LinkedListNode<object> PreviousOrLast(this LinkedListNode<object> current)
    {
        if (current.Previous == null)
            return current.List.Last;
        return current.Previous;
    }
}

LinkedListNode を適切なジェネリック型でインスタンス化していることを確認してください。他の型 (文字列など) を使用すると機能しません。ただし、コードを次のように変更することで、これを拡張して任意のタイプの LinkedListNode をサポートできます。

class Program
{
    static void Main(string[] args)
    {
        LinkedListNode<string> node = new LinkedListNode<string>("Hello World");
        node.NextOrFirst<string>();

        LinkedListNode<int> node2 = new LinkedListNode<int>(3);
        node2.NextOrFirst<int>();
    }
}

static class CircularLinkedList
{
    public static LinkedListNode<T> NextOrFirst<T>(this LinkedListNode<T> current)
    {
        if (current.Next == null)
            return current.List.First;
        return current.Next;
    }

    public static LinkedListNode<T> PreviousOrLast<T>(this LinkedListNode<T> current)
    {
        if (current.Previous == null)
            return current.List.Last;
        return current.Previous;
    }
}
于 2013-01-12T07:53:31.580 に答える