IDictionaryEnumerator 接口
枚举非泛型字典的元素。
**命名空间:**System.Collections
**程序集:**mscorlib(在 mscorlib.dll 中)
语法
声明
<ComVisibleAttribute(True)> _
Public Interface IDictionaryEnumerator
Inherits IEnumerator
用法
Dim instance As IDictionaryEnumerator
[ComVisibleAttribute(true)]
public interface IDictionaryEnumerator : IEnumerator
[ComVisibleAttribute(true)]
public interface class IDictionaryEnumerator : IEnumerator
/** @attribute ComVisibleAttribute(true) */
public interface IDictionaryEnumerator extends IEnumerator
ComVisibleAttribute(true)
public interface IDictionaryEnumerator extends IEnumerator
备注
C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用 foreach,而不直接操作枚举数。
枚举数可用于读取集合中的数据,但不能用于修改基础集合。
最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数向前移动到集合的第一个元素。
在调用 MoveNext 或 Reset 之前,Current 返回同一对象。MoveNext 将 Current 设置为下一个元素。
如果 MoveNext 越过集合的结尾,则枚举数将被定位在此集合中最后一个元素的后面,且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。
只要集合保持不变,枚举数就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发 InvalidOperationException。如果在 MoveNext 和 Current 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。
枚举数没有对集合的独占访问权;因此,枚举通过集合在本质上不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
给实现者的说明 从 IEnumerator 继承的 Current 属性返回一个 Object,此返回值是一个已装箱的 DictionaryEntry,与 Entry 属性的返回值类似。
示例
此代码示例演示如何定义实现 IDictionaryEnumerator 接口的字典枚举数。
Private Class SimpleDictionaryEnumerator
Implements IDictionaryEnumerator
' A copy of the SimpleDictionary object's key/value pairs.
Dim items() As DictionaryEntry
Dim index As Integer = -1
Public Sub New(ByVal sd As SimpleDictionary)
' Make a copy of the dictionary entries currently in the SimpleDictionary object.
items = New DictionaryEntry(sd.Count - 1) {}
Array.Copy(sd.items, 0, items, 0, sd.Count)
End Sub
' Return the current item.
Public ReadOnly Property Current() As Object Implements IDictionaryEnumerator.Current
Get
ValidateIndex()
Return items(index)
End Get
End Property
' Return the current dictionary entry.
Public ReadOnly Property Entry() As DictionaryEntry Implements IDictionaryEnumerator.Entry
Get
Return Current
End Get
End Property
' Return the key of the current item.
Public ReadOnly Property Key() As Object Implements IDictionaryEnumerator.Key
Get
ValidateIndex()
Return items(index).Key
End Get
End Property
' Return the value of the current item.
Public ReadOnly Property Value() As Object Implements IDictionaryEnumerator.Value
Get
ValidateIndex()
Return items(index).Value
End Get
End Property
' Advance to the next item.
Public Function MoveNext() As Boolean Implements IDictionaryEnumerator.MoveNext
If index < items.Length - 1 Then
index = index + 1
Return True
End If
Return False
End Function
' Validate the enumeration index and throw an exception if the index is out of range.
Private Sub ValidateIndex()
If index < 0 Or index >= items.Length Then
Throw New InvalidOperationException("Enumerator is before or after the collection.")
End If
End Sub
' Reset the index to restart the enumeration.
Public Sub Reset() Implements IDictionaryEnumerator.Reset
index = -1
End Sub
End Class
Public Function GetEnumerator() As IDictionaryEnumerator Implements IDictionary.GetEnumerator
'Construct and return an enumerator.
Return New SimpleDictionaryEnumerator(Me)
End Function
' ICollection Members
Public ReadOnly Property IsSynchronized() As Boolean Implements IDictionary.IsSynchronized
Get
Return False
End Get
End Property
Public ReadOnly Property SyncRoot() As Object Implements IDictionary.SyncRoot
Get
Throw New NotImplementedException()
End Get
End Property
Public ReadOnly Property Count() As Integer Implements IDictionary.Count
Get
Return ItemsInUse
End Get
End Property
Public Sub CopyTo(ByVal array As Array, ByVal index As Integer) Implements IDictionary.CopyTo
Throw New NotImplementedException()
End Sub
' IEnumerable Members
Public Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
' Construct and return an enumerator.
Return Me.GetEnumerator()
End Function
End Class
private class SimpleDictionaryEnumerator : IDictionaryEnumerator
{
// A copy of the SimpleDictionary object's key/value pairs.
DictionaryEntry[] items;
Int32 index = -1;
public SimpleDictionaryEnumerator(SimpleDictionary sd)
{
// Make a copy of the dictionary entries currently in the SimpleDictionary object.
items = new DictionaryEntry[sd.Count];
Array.Copy(sd.items, 0, items, 0, sd.Count);
}
// Return the current item.
public Object Current { get { ValidateIndex(); return items[index]; } }
// Return the current dictionary entry.
public DictionaryEntry Entry
{
get { return (DictionaryEntry) Current; }
}
// Return the key of the current item.
public Object Key { get { ValidateIndex(); return items[index].Key; } }
// Return the value of the current item.
public Object Value { get { ValidateIndex(); return items[index].Value; } }
// Advance to the next item.
public Boolean MoveNext()
{
if (index < items.Length - 1) { index++; return true; }
return false;
}
// Validate the enumeration index and throw an exception if the index is out of range.
private void ValidateIndex()
{
if (index < 0 || index >= items.Length)
throw new InvalidOperationException("Enumerator is before or after the collection.");
}
// Reset the index to restart the enumeration.
public void Reset()
{
index = -1;
}
}
public IDictionaryEnumerator GetEnumerator()
{
// Construct and return an enumerator.
return new SimpleDictionaryEnumerator(this);
}
#endregion
#region ICollection Members
public bool IsSynchronized { get { return false; } }
public object SyncRoot { get { throw new NotImplementedException(); } }
public int Count { get { return ItemsInUse; } }
public void CopyTo(Array array, int index) { throw new NotImplementedException(); }
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
// Construct and return an enumerator.
return ((IDictionary)this).GetEnumerator();
}
#endregion
}
private:
ref class SimpleDictionaryEnumerator : public IDictionaryEnumerator
{
// A copy of the SimpleDictionary object's key/value pairs.
private:
array<DictionaryEntry^>^ items;
private:
int index;
public:
SimpleDictionaryEnumerator(SimpleDictionary^ sd)
{
// Make a copy of the dictionary entries currently in the
// SimpleDictionary object.
items = gcnew array<DictionaryEntry^>(sd->Count);
Array::Copy(sd->items, 0, items, 0, sd->Count);
index = -1;
}
// Return the current item.
public:
virtual property Object^ Current
{
Object^ get()
{
ValidateIndex();
return items[index];
}
}
// Return the current dictionary entry.
public:
virtual property DictionaryEntry Entry
{
DictionaryEntry get()
{
return (DictionaryEntry) Current;
}
}
// Return the key of the current item.
public:
virtual property Object^ Key
{
Object^ get()
{
ValidateIndex();
return items[index]->Key;
}
}
// Return the value of the current item.
public:
virtual property Object^ Value
{
Object^ get()
{
ValidateIndex();
return items[index]->Value;
}
}
// Advance to the next item.
public:
virtual bool MoveNext()
{
if (index < items->Length - 1)
{
index++;
return true;
}
return false;
}
// Validate the enumeration index and throw an exception if
// the index is out of range.
private:
void ValidateIndex()
{
if (index < 0 || index >= items->Length)
{
throw gcnew InvalidOperationException
("Enumerator is before or after the collection.");
}
}
// Reset the index to restart the enumeration.
public:
virtual void Reset()
{
index = -1;
}
};
public:
virtual IDictionaryEnumerator^ GetEnumerator()
{
// Construct and return an enumerator.
return gcnew SimpleDictionaryEnumerator(this);
}
#pragma endregion
#pragma region ICollection Members
public:
virtual property bool IsSynchronized
{
bool get()
{
return false;
}
}
public:
virtual property Object^ SyncRoot
{
Object^ get()
{
throw gcnew NotImplementedException();
}
}
public:
virtual property int Count
{
int get()
{
return itemsInUse;
}
}
public:
virtual void CopyTo(Array^ array, int index)
{
throw gcnew NotImplementedException();
}
#pragma endregion
#pragma region IEnumerable Members
virtual IEnumerator^ IEnumerable_GetEnumerator()
= IEnumerable::GetEnumerator
{
// Construct and return an enumerator.
return ((IDictionary^)this)->GetEnumerator();
}
#pragma endregion
};
平台
Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0
请参见
参考
IDictionaryEnumerator 成员
System.Collections 命名空间
IDictionary 接口
IEnumerator
System.Collections.Generic.IEnumerator