2010-05-07 123 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

相关问题