我有一个包含静态数量对象的类。此类需要经常与其他将是简单列表对象的类进行“比较”。
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,我对从哪里开始感到很困惑。
最佳答案
您需要创建一个迭代器来返回驻留在工作表中的项目。
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/