我如何实现IEnumerable?

时间:2010-05-07 14:42:59

标签: c# 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<Item> 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,我对从哪里开始感到困惑。

1 个答案:

答案 0 :(得分:12)

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

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();
    }
}