将索引添加到自定义列表

时间:2009-09-30 15:58:12

标签: c#

我有以下列表:

public class MyQueue : IEnumerable<int>
{
    private Node Head { get; set; }
    private Node Tail { get; set; }

    public MyQueue()
    {
        Head = null;
    }

    public void Add(int item)
    {
        Enqueue(item);
    }

    public void Enqueue(int item)
    {
        var newItem = new Node { Data = item };

        if (Head == null)
        {
            Head = newItem;
            Tail = newItem;
            return;
        }

        Node last = Tail;
        last.Next = newItem;
        Tail = newItem;
    }
    public IEnumerator<int> GetEnumerator()
    {
        Node current = Head;
        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    private class Node
    {
        public int Data;
        public Node Next;
    }
}

还有其他方法,但在这种情况下它们并不重要。 我想在此列表中添加索引。

所以我可以这样做:

var q = new MyQueue() {1, 2};
Console.WriteLine(q[0]); //1

我需要实施什么?

5 个答案:

答案 0 :(得分:5)

你需要制作这样的房产:

public int this[int index]
{
    get {
        // code to return value
    }
}

答案 1 :(得分:4)

public int this[int index]
{
    get
    {
        return this.Skip(index).FirstOrDefault();
    }
}

答案 2 :(得分:3)

您需要实施indexer。通过索引器,您可以访问classstructinterface,就像它是一个数组一样。语法如下:

public int this[int index] {
    get {
        // obtain the item that corresponds to this index
        // return the item
    }
    set { 
        // set the value of the item that corresponds to 
        // index to be equal to the implicit parameter named "value"
    }
}

以下是您案例的明确示例:

public class MyQueue : IEnumerable<int> {
    // ...
    public int this[int index] {
        get {
            if (index < 0 || index > this.Count() - 1) {
                throw new ArgumentOutOfRangeException("index");
            }
            return this.Skip(index).First();
        }
        set {
            if (index < 0) {
                throw new ArgumentOutOfRangeException("index");
            }
            Node current = Head;
            int i = 0;
            while (current != null && i < index) {
                current = current.Next; i++;
            }
            if (current == null) {
                throw new ArgumentOutOfRangeException("index");
            }
            current.Data = value;
        }
    }
}    

答案 3 :(得分:1)

实施this运营商。

答案 4 :(得分:1)

写一个this property,如下所示:(双关语)

public int this[int index] {
    get {
        return something;
    }

    //Optionally:
    set {
        something = value;
    }
}

此外,您应该实施IList<int>。 (但请注意,Count属性需要循环)