2013-12-08 2 views
0

Пожалуйста, смотрите ниже код, который был написан кем-то еще и работает очень хорошо:Список IEnumerables

Public Function GetMembers(Optional ByVal sortExpression As String = "MemberId ASC") As List(Of Member) Implements IMemberDao.GetMembers 
      Dim sql As String = 
       " SELECT MemberId, Email, CompanyName, City, Country" & 
       " FROM [Member] ".OrderBy(sortExpression) 

      Return db.Read(sql, Make).ToList() 
     End Function 

Public Iterator Function Read(Of T)(ByVal sql As String, ByVal make As Func(Of IDataReader, T), ParamArray ByVal parms() As Object) As IEnumerable(Of T) 
      Using connection = CreateConnection() 
       Using command = CreateCommand(sql, connection, parms) 
        Using reader = command.ExecuteReader() 
         Do While reader.Read() 
          Yield make(reader) 
         Loop 
        End Using 
       End Using 
      End Using 
     End Function 

Private Shared Make As Func(Of IDataReader, Member) = 
      Function(reader) _ 
       New Member() With { 
        .MemberId = Extensions.AsId(reader("MemberId")), 
        .Email = Extensions.AsString(reader("Email")), 
        .CompanyName = Extensions.AsString(reader("CompanyName")), 
        .City = Extensions.AsString(reader("City")), 
        .Country = Extensions.AsString(reader("Country")) 
       } 

Я понимаю, что сделать это, делегат, который заполняет объекты-члены со значениями, но я не понимаю как список лиц возвращается функцией Read? (список возвращается и работает очень хорошо).

+1

он делает это, используя выход. Вот как работают итераторы. посмотрите здесь ... http://msdn.microsoft.com/en-us/library/vstudio/hh156729.aspx –

ответ

2

он делает это по ключевому слову yield. Обычно это работает, когда вы выполняете итерацию по коллекции. Посмотрите здесь:

http://msdn.microsoft.com/en-us/library/vstudio/hh156729.aspx

Это должно дать вам хорошее/простое понимание.

+0

Спасибо. Я понимаю эту часть. Я не понимаю, где объект Member сохраняется после вызова Yield. Можете ли вы подробно остановиться на этом? – w0051977

+0

Конечно. Извините - что вы имеете в виду объект-член? вы имеете в виду текущий элемент, который он извлекает? Компилятор сгенерирует класс, который реализует IEnumerator, который имеет функцию MoveNext() и свойство Current. Класс будет иметь все члены, необходимые для хранения состояния функции между вызовами. –

+0

Кроме того, взгляните на это: http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx - «Когда доходность return return достигается в методе итератора, выражение возвращается, а текущее местоположение в коде сохраняется. Выполнение перезапускается из этого места при следующем вызове функции итератора. " –

Смежные вопросы