Объект все еще связан со списком после FirstOrDefault? - PullRequest
12 голосов
/ 13 марта 2010

Вот мой код:

        Event thisEvent = (from i in list
                           where (i.eventID == eventID)
                           select i).FirstOrDefault();
        if (thisEvent != null)
        {
            thisEvent.eventResolved = resolved;
            thisEvent.eventSequence.Add(item);
        }

"список" - это коллекция IEnumerable, т. Е.

IEnumerable<Event> list;

Что мне интересно, так это: после создания thisEvent с помощью FirstOrDefault, остается ли thisEvent подключенным к списку? Другими словами, когда я изменяю два свойства, eventResolved и eventSequence, действительно ли «список» изменяется, или thisEvent - просто полностью отключенная копия элемента в «списке»?

Ответы [ 4 ]

14 голосов
/ 13 марта 2010

FirstOrDefault выбирает элемент в коллекции, но не «извлекает» и не «клонирует» его. То есть это тот же экземпляр. Поэтому, если вы изменяете свойство, вы изменяете исходный экземпляр.

Если вы хотите «отцепить» объект, вам придется скопировать его тем или иным способом.

2 голосов
/ 13 марта 2010

список не изменяется и по-прежнему включает объект, возвращенный FirstOrDefault.

Это общее правило для всех операторов LINQ: они никогда не изменяют исходную коллекцию.

Также обратите внимание, что thisEvent не является «копией» (если Event не является типом значения (struct), а не классом) - это ссылка на тот же объект, на который есть ссылка в списке.

0 голосов
/ 27 марта 2019

Осторожно, это правда, если ваша коллекция находится в памяти. Если ваша коллекция является результатом запроса к базе данных, коллекция не материализуется, пока вы не вызовете ToList для нее. Если вы выполните FirstOrDefault до этого, он сделает запрос к базе данных, чтобы вернуть только этот результат, а затем материализация вашей коллекции сделает отдельный вызов БД, и вы не будете использовать тот же экземпляр. Это просто случилось со мной, поэтому я надеюсь, что это может помочь кому-то еще.

0 голосов
/ 13 марта 2010

Если Event является ссылочным типом, то да, изменение thisEvent изменит элемент в списке.

...