Является ли объект по-прежнему подключен к списку после FirstOrDefault?
Здесь мой код:
Event thisEvent = (from i in list
where (i.eventID == eventID)
select i).FirstOrDefault();
if (thisEvent != null)
{
thisEvent.eventResolved = resolved;
thisEvent.eventSequence.Add(item);
}
"list" - это коллекция IEnumerable, т.е.
IEnumerable<Event> list;
Мне интересно: после создания thisEvent, используя FirstOrDefault, этотEvent все еще подключен к списку? Другими словами, когда я изменяю два свойства, eventResolved и eventSequence, это "список", фактически измененный, или это thisEvent только некоторая полностью отключенная копия элемента в "списке"?
Ответы
Ответ 1
FirstOrDefault
выбирает элемент в коллекции, но не "отлаживает" или "клонирует" его. То есть это тот же самый экземпляр. Поэтому, если вы измените свойство, вы измените исходный экземпляр.
Если вы хотите "отменить" объект, вам придется его каким-то образом скопировать.
Ответ 2
список не изменяется и по-прежнему включает объект, возвращенный FirstOrDefault.
Это общее правило со всеми операторами LINQ: они никогда не изменяют исходную коллекцию.
Также обратите внимание, что thisEvent не является "копией" (если событие не является типом значения (struct), а не классом) - это ссылка на тот же объект, который указан в списке.
Ответ 3
Если Event
является ссылочным типом, тогда да, изменение thisEvent
изменит элемент в списке.
Ответ 4
Осторожно, это правда, если ваша коллекция находится в памяти. Если ваша коллекция является результатом запроса к базе данных, коллекция не материализуется, пока вы не вызовете ToList для нее. Если вы выполните FirstOrDefault до этого, он сделает запрос к базе данных, чтобы вернуть только этот результат, а затем материализация вашей коллекции сделает отдельный вызов БД, и вы не будете использовать тот же экземпляр. Это просто случилось со мной, поэтому я надеюсь, что это может помочь кому-то еще.