我有以下列表:
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
我需要实施什么?
答案 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。通过索引器,您可以访问class
,struct
或interface
,就像它是一个数组一样。语法如下:
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
属性需要循环)