c# - 我如何实现 IEnumerable?

标签 c# 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 ,必须在代码和运行时进行测试。

这一切都很好;这不是我的问题。我的问题是迭代它。例如,我想执行以下操作......

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

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

很自然地,对于一个普通的列表,它会像这样。

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

但由于“工作表”不是“列表”,我不能那样做。所以我想实现 IEnumerable 这样我就可以了。有什么建议么?我以前从未直接实现过 IEnumerable,我对从哪里开始感到很困惑。

最佳答案

您需要创建一个迭代器来返回驻留在工作表中的项目。

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

关于c# - 我如何实现 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789389/

相关文章:

C# 泛型方法解析失败,出现不明确的调用错误

c# - AcceptSocket 不尊重 Thread.Abort 请求

c# - 奇怪的委托(delegate)引用行为

c# - 在 IEnumerable 集合中查找所有受抚养子女的最佳方法是什么

c# - 循环访问一组图像资源 (.resx)

c# - 将参数传递给模板化类型的 C# 泛型 new()

c# - WCF 的 ClientBase<TChannel> 在 Disposed 时如何处理 TCP 连接?

c# - 为什么 IEnumerable<T> 只有 "out"协变标志而不是 "in"c#?

c# - IEnumerable 在使用后是否存储对象

asp.net-mvc-3 - 将复选框绑定(bind)到 MVC 中的 int 数组/可枚举