DataTableReader.GetEnumerator Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает перечислитель, который может использоваться для перемещения по коллекции элементов.
public:
override System::Collections::IEnumerator ^ GetEnumerator();
public override System.Collections.IEnumerator GetEnumerator ();
override this.GetEnumerator : unit -> System.Collections.IEnumerator
Public Overrides Function GetEnumerator () As IEnumerator
Возвращаемое значение
Объект IEnumerator, представляющий коллекцию элементов.
Исключения
Предпринята попытка чтения или доступа к столбцу закрытого объекта DataTableReader.
Примеры
В следующем примере иллюстрируется использование метода GetEnumerator. Сюда входит поведение перечислителя при удалении строк из базового DataTable элемента, когда перечислитель активен.
public static void Main()
{
try
{
DataTable userTable = new DataTable("peopleTable");
userTable.Columns.Add("Id", typeof(int));
userTable.Columns.Add("Name", typeof(string));
// Note that even if you create the DataTableReader
// before adding the rows, the enumerator can still
// visit all the rows.
DataTableReader reader = userTable.CreateDataReader();
userTable.Rows.Add(new object[] { 1, "Peter" });
userTable.Rows.Add(new object[] { 2, "Mary" });
userTable.Rows.Add(new object[] { 3, "Andy" });
userTable.Rows.Add(new object[] { 4, "Russ" });
IEnumerator enumerator = reader.GetEnumerator();
// Keep track of whether the row to be deleted
// has actually been deleted yet. This allows
// this sample to demonstrate that the enumerator
// is able to survive row deletion.
bool isRowDeleted = false;
while (enumerator.MoveNext())
{
DbDataRecord dataRecord = (DbDataRecord)enumerator.Current;
// While the enumerator is active, delete a row.
// This doesn't affect the behavior of the enumerator.
if (!isRowDeleted)
{
isRowDeleted = true;
userTable.Rows[2].Delete();
}
Console.WriteLine(dataRecord.GetString(1));
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadLine();
}
Sub Main()
Try
Dim userTable As New DataTable("peopleTable")
userTable.Columns.Add("Id", GetType(Integer))
userTable.Columns.Add("Name", GetType(String))
' Note that even if you create the DataTableReader
' before adding the rows, the enumerator can still
' visit all the rows.
Dim reader As DataTableReader = userTable.CreateDataReader()
userTable.Rows.Add(1, "Peter")
userTable.Rows.Add(2, "Mary")
userTable.Rows.Add(3, "Andy")
userTable.Rows.Add(4, "Russ")
Dim enumerator As IEnumerator = reader.GetEnumerator()
' Keep track of whether the row to be deleted
' has actually been deleted yet. This allows
' this sample to demonstrate that the enumerator
' is able to survive row deletion.
Dim isRowDeleted As Boolean = False
While (enumerator.MoveNext())
Dim dataRecord As DbDataRecord = CType(enumerator.Current, _
DbDataRecord)
' While the enumerator is active, delete a row.
' This doesn't affect the behavior of the enumerator.
If Not isRowDeleted Then
isRowDeleted = True
userTable.Rows(2).Delete()
End If
Console.WriteLine(dataRecord.GetString(1))
End While
Catch ex As Exception
Console.WriteLine(ex)
End Try
Console.ReadLine()
End Sub
Процедура отображает следующий текст в окне Консоли:
Peter
Mary
Russ
Комментарии
Перечислители позволяют только считывать данные в DataTableReader. Перечислители нельзя использовать для изменения базовой коллекции.
Сначала перечислитель размещается перед первым элементом в коллекции. В этой позиции вызов Current вызывает исключение. Поэтому необходимо вызвать метод MoveNext
, чтобы переместить перечислитель к первому элементу коллекции до считывания значения свойства Current
.
Current
возвращает объект DbDataRecordи возвращает тот же объект до тех пор, пока не MoveNext будет вызвана или Reset . MoveNext
задает Current
в качестве значения для следующего элемента.
После того как будет передан конец коллекции, перечислитель позиционируется после последнего элемента в коллекции, а вызов MoveNext
возвращает значение false. Если последний вызов MoveNext
возвращал false
, вызов Current
вызывает исключение. Кроме того, так как DataTableReader предоставляет только прямого доступа к своим данным, вызов Reset метода IEnumerator вызывает исключение NotSupportedException.
предоставляет DataTableReader стабильный перечислитель. Это означает, что даже при удалении или добавлении строк в базовых данных перечислитель, возвращаемый вызовом , по-прежнему GetEnumerator действителен.