Я сам написал это 6+ месяцев назад, и теперь не могу вспомнить, почему это работает ...

У меня есть следующий фрагмент кода:

var grouped = alleSkjema.GroupBy(q => q.OrgID);
var newGroupList = grouped.Where(q => q.Count() < 4).SelectMany(p => p).ToList();
newGroupList.ForEach(p => p.OrgID = u.tre.First().orgid);

Где alleSkjema - это IEnumerable<T> с некоторыми свойствами. OrgID - это своего рода идентификатор отдела, а T в этом контексте - это человек.

То, что я делаю в приведенном выше коде, - это группировка всех, кто принадлежит к отделу менее 4 человек, в их собственную группу. Это сделано из соображений анонимности и на самом деле не важно для решения.

Что происходит дальше, так это то, что только в трех приведенных выше строках изменяется alleSkjema, и я не могу понять почему. Думаю, изменчивость кусает меня под зад? Я думал, что мне нужно сделать то, что я делаю в последней строке коллекции alleSkjema, чтобы получить желаемый результат. Содержит ли newGroupList как-нибудь ссылку на коллекцию alleSkjema?

0
Christian Wattengård 18 Фев 2016 в 15:38

2 ответа

Лучший ответ

Причина здесь: p.OrgID = u.tre.First().orgid

Вы не «дублируете» объекты, поэтому элементы, содержащиеся в alleSkjema, являются надмножеством элементов, созданных в newGroupList. Для ясности: если X содержится в alleSkjema и X проходит проверку, то X помещается в newGroupList. Тот же X, а не копия X. Это потому, что ваши объекты являются ссылочными типами.

5
xanatos 18 Фев 2016 в 12:41

Ваша переменная alleSkjema вообще не изменяется. Однако кажется, что он содержит ссылки, и экземпляры, на которые эти ссылки указывают , изменены вашей последней строкой.

0
nvoigt 18 Фев 2016 в 12:41