2010-05-07 122 views
5

我有一個包含靜態數量的對象的類。這個類需要經常與其他簡單的List對象進行「比較」。如何實現IEnumerable?

public partial class Sheet 
{ 
public Item X{ get; set; } 
public Item Y{ get; set; } 
public Item Z{ get; set; } 
} 

這些項目顯然不會是「X」「Y」「Z」,例如這些只是通用名稱。問題在於,由於需要做什麼的性質,列表不起作用;即使這裏的所有內容都是Item類型。它就像是一個非常具體的事情清單,必須在代碼和運行時測試。

這工作都很好,這不是我的問題。我的問題是迭代它。例如,我想要執行以下操作...

List<Item> UncheckedItems = // Repository Logic Here. 

UncheckedItems包含所有可用項目;而CheckedItems是Sheet類實例。 CheckedItems將包含從未選中移到檢查的項目;但是由於存儲系統的性質,移動到Checked的項目不能從Unchecked中刪除。我只是想遍歷「Checked」並從Unchecked列表中刪除已經在「Checked」中的任何內容。

所以很自然地,這將是一個正常的列表。

foreach(Item item in Unchecked) 
{ 
if(Checked.Contains(item)) 
Unchecked.Remove(item); 
} 

但是由於「Sheet」不是「List」,我不能這樣做。所以我想實現IEnumerable,以便我可以。有什麼建議麼?我從來沒有直接實現過IEnumerable,我對從何處開始感到困惑。

回答

12

您需要創建一個迭代器,該迭代器返回駐留在工作表中的項目。

Using Iterators

public partial class Sheet 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerable<Item> EnumerateItems() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 
} 

如果你不希望有打電話給你可以做到這一點的方法。

public partial class Sheet : IEnumerable<Item> 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerator<Item> GetEnumerator() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 

    IEnumerator IEnumerator.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+1

您也可以將這些yield語句直接放在GetEnumerator方法中。 – 2010-05-07 15:10:38

+0

@Steve - 現在很酷。 – ChaosPandion 2010-05-07 15:15:40

+0

@ChaosPandion - 即使對象被返回,它如何被移除?這個問題也不是如何去除對象? – Prashant 2010-05-07 15:23:12

相關問題