2009-09-30 129 views
0

我有以下列表:添加索引,以自定義列表

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 

我需要做什麼來實現?

回答

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

q [0]返回值2而不是1 :)否則,它真的很聰明! – CasperT 2009-09-30 16:08:18

+2

你確定嗎?適用於我的機器。對於索引== 0跳過(0)沒有「沒有」。 – mancaus 2009-09-30 16:14:45

+0

我的壞!我在測試用例中進一步測試了代碼(還有很多其他的東西)。 它的作品完美,我喜歡聰明的執行 – CasperT 2009-09-30 16:17:55

1

執行this運算符。

+3

我可以用多一點幫助:) *眉來眼去* – CasperT 2009-09-30 16:01:48

+0

嘿,我不能寫所有的代碼給你。 ;) – 2009-09-30 16:04:59

+1

是的,但你可以也應該顯示'this'屬性的語法(就像我的答案)。 – SLaks 2009-09-30 16:12:48

5

你需要的屬性是這樣的:

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

this property,像這樣:(雙關語意)

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

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

此外,你應該實現IList<int>。 (請注意,雖然,Count屬性將需要一個循環)

+0

我想知道你爲什麼認爲我應該IList :) 有什麼優勢? – CasperT 2009-09-30 16:18:42

+0

因此,任何使用IList 的代碼都可以使用你的課程。 – SLaks 2009-09-30 16:23:15

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; 
     } 
    } 
}  
+0

+ +1努力:) – CasperT 2009-09-30 16:35:41

相關問題