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의 제안 사항에 따라
SomeItem[] changedItems = _Items.Where(item => item.HasChanged);
.
if (_Items.Any(item => item.HasChanged))
{
// An item has changed, do stuff.
}
"상상의 IEnumerator 개체"전혀 가상이 아닙니다. 실제로 IEnumerable.GetEnumerator()를 호출합니다. – BoltClock
확인 http://stackoverflow.com/questions/7396112/detecting-modifications-with-an-ienumerable 건배! –
"상상"어떻게? –