Подтвердить что ты не робот

Является ли объект по-прежнему подключен к списку после 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 только некоторая полностью отключенная копия элемента в "списке"?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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