【问题标题】:How do I implement IEnumerable?如何实现 IEnumerable?
【发布时间】:2010-05-07 14:42:58
【问题描述】:

我有一个包含静态数量对象的类。这个类需要经常与其他简单的 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 的项目;但是,由于存储系统的性质,移动到 Checked 的项目不能从 Unchecked 中删除。我只是想遍历“已检查”并从“已检查”中的“未检查”列表中删除任何内容。

所以很自然,这与普通列表一样。

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

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

【问题讨论】:

    标签: c# ienumerable


    【解决方案1】:

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

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

    【讨论】:

    • 你也可以将这些yield语句直接放在GetEnumerator方法中。
    • @ChaosPandion - 即使返回对象,如何将其删除?问题不也是如何删除对象吗?
    • @Prashant - 我相信问题只是关于实现 IEnumerable。他们会澄清我是否不正确。
    • @Prashant 您首先不能从 IEnumerable 中删除,并且 OP 正在询问是否实现 IEnumerable。 OP 可能需要实现的方法是一对有条件的 IEnumerables(如果 X.checked yield return X 等),它将根据需要延迟加载必要的“列表”。然后你甚至不需要修改“列表”,你只需要修改实际的项目。我也认为这更适合 OP 描述情况的代码。
    • @ChaosPandian, @ccornet - 明白了。还有OP是什么意思?
    猜你喜欢
    • 2012-07-03
    • 2014-12-20
    • 1970-01-01
    • 2014-12-04
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2011-01-20
    相关资源
    最近更新 更多