Изменение свойства объекта внутри цикла foreach не работает? - PullRequest
5 голосов
/ 21 мая 2011

Это озадачивает меня. Я использую PetaPoco для получения некоторых значений из базы данных, а затем зацикливаю их и получаю значение, которое присваивается одному из свойств каждого объекта.

    public IEnumerable<RetreaveIndex> FillResults(IEnumerable<RetreaveIndex> results)
    {
        //add the associated users
        foreach (RetreaveIndex index in results)
        {
            index.AssociatedUsers = _registeredUserDao.GetUsersByIndex(index).ToList();
        }
        return results;
    }

Когда я устанавливаю точку останова во время цикла foreach, свойство AssociatedUsers устанавливается правильно. during foreach loop

но затем в точке останова в конце цикла это не сохранилось? enter image description here

Я запутался, разве Индекс не должен быть ссылкой на место в памяти, которое изменяется? Это объект в конце концов. Что мне здесь не хватает?

Ответы [ 4 ]

8 голосов
/ 21 мая 2011
  1. Что такое реализация IEnumerable? Может ли это быть возвращением копии объекта?

  2. Является ли RetreaveIndex структурой и, следовательно, типом значения? Если это так, то переменная index будет копией.

3 голосов
/ 21 мая 2011

В зависимости от того, как реализован переданный объект IEnumerable, он не требует, чтобы при следующем перечислении данных он возвращал те же объекты, что и раньше.Попробуйте превратить IEnumerable в список перед циклом foreach и вернуть это место.

1 голос
/ 21 мая 2011

С веб-сайта проекта :

Запрос против извлечения

В классе базы данных есть два метода для извлечения записей: Запрос иFetch.Они в значительной степени идентичны, за исключением того, что Fetch возвращает List <> POCO, тогда как Query использует yield return для перебора результатов без загрузки всего набора в память.

Другими словами, Query re-загружает значения из резервного хранилища каждый раз и не сохраняет элемент после его перечисления.Когда вы снова смотрите на предмет после окончания цикла, он снова загружается из резервного хранилища.

0 голосов
/ 03 июня 2011

На самом деле происходит неправильная интерпретация выходных данных синтаксиса yield return.

Происходит следующее: когда вы перебираете IEnumerable, возвращаемое из yield return, выполняется код после этого yield return.В техническом плане yield return делает ленивую оценку.Таким образом, общий эффект вашего цикла foreach состоит в том, что он вызывает код для создания элемента в IEnumerable, поскольку в этом элементе содержится много элементов IEnumerable.

Следующая запись из CodeProject делаетотличная работа по объяснению этого поведения: http://www.codeproject.com/Articles/38097/The-Mystery-Behind-Yield-Return.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...