IEnumerable 接口实际上返回了 IEnumerator,这是该接口存在的全部原因。
当调用 foreach 块时,调用 IEnumerable.GetEnumerator() 方法来获取枚举器。
如果您想跟踪每个项目,那么因为它们是对象类型,它们将被引用,因此您将获得最新版本的更新。在项目中,您可以像这样实现您提到的版本控制。
public class SomeItem
{
private string _Value;
private int _Version = 0;
private int _LastKnown = 0;
public SomeItem()
{
}
public SomeItem(string value)
{
this._Value = value
}
public string Value
{
get { return this._Value; }
set { if (this._Value != value) { this._Value = value; this._Version++; } }
}
public int Version
{
get { return this._Version; }
}
public bool HasChanged
{
get { return (this._Version != _LastKnown); }
}
// Reset change tracking.
public void Reset()
{
this._LastKnown = this._Version;
}
}
在其他地方,您可以在循环中使用类似的东西。
private List<SomeItem> _Items = new List<SomeItem>();
// Add an item.
_Items.Add(new SomeItem("ABC"));
// Add a changed item.
SomeItem itemN = new SomeItem("EFG");
itemN.Value = "XYZ";
_Items.Add(itemN);
foreach (SomeItem item in _Items)
{
if (item.HasChanged)
{
// Do stuff here.
//throw new Exception()
}
}
更新
或者,如果您只是想找出哪些项目发生了变化,您可以这样做。
SomeItem[] changedItems = _Items.Where(item => item.HasChanged);
根据 dlev 的建议,如果您只想知道是否有任何更改,请使用。
if (_Items.Any(item => item.HasChanged))
{
// An item has changed, do stuff.
}