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()
}
}
あなただけのアイテムは、あなたがこのような何かを行うことが変わってきたかを知りたい場合は
代わりに更新しました。
dlevの提案によれば、ちょうど使用が変更されたかどうかを知りたい場合は、
if (_Items.Any(item => item.HasChanged))
{
// An item has changed, do stuff.
}
"想像上のIEnumeratorオブジェクト"これはまったく虚偽ではありません。実際には、IEnumerable.GetEnumerator()の呼び出しがあります。 – BoltClock
Check http://stackoverflow.com/questions/7396112/detecting-modifications-with-an-ienumerable乾杯! –
"想像"どのように? –