我如何实现IEnumerable?

我有一个包含静态对象数的类。 需要经常将此类与其他将成为简单List对象的类进行“比较”。

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

这些项目显然不会是“X”“Y”“Z”,这些只是通用名称。 问题在于,由于需要做的事情的性质,列表不起作用; 即使这里的所有东西都是Item类型。 它就像一个非常具体的事项清单,必须在代码和运行时进行测试。

这一切都很好,很好; 这不是我的问题。 我的问题是迭代它。 例如,我想做以下事情……

 List UncheckedItems = // Repository Logic Here. 

UncheckedItems包含所有可用项目; CheckedItems是Sheet类实例。 CheckedItems将包含从Unchecked移动到Checked的项目; 但是由于存储系统的性质,移动到“已检查”的项目无法从“未选中”中删除。 我只想迭代“已检查”并从“已检查”中的已取消选中的列表中删除任何内容。

所以很自然地,这将是一个普通的列表。

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

但由于“Sheet”不是“List”,我不能这样做。 所以我想实现IEnumerable以便我可以。 有什么建议? 我以前从未直接实现过IEnumerable,而且我很困惑从哪里开始。

您需要创建一个迭代器,返回驻留在Sheet中的Items。

使用迭代器

 public partial class Sheet { public Item X{ get; set; } public Item Y{ get; set; } public Item Z{ get; set; } public IEnumerable EnumerateItems() { yield return X; yield return Y; yield return Z; // ... } } 

如果您不想调用该方法,则可以执行此操作。

 public partial class Sheet : IEnumerable { public Item X{ get; set; } public Item Y{ get; set; } public Item Z{ get; set; } public IEnumerator GetEnumerator() { yield return X; yield return Y; yield return Z; // ... } IEnumerator IEnumerator.GetEnumerator() { return GetEnumerator(); } }