Это не может быть сделано непосредственно в LINQ, для этого требуется дополнительный код с вашей стороны.
Если ваши объекты (. В этом случае RRProcess
) не имеет членов, которые являются объектами, то вы можете реализовать метод клонирования для вашего объекта, как показано ниже:
public RRProcess Clone()
{
return this.MemberwiseClone();
}
Замечу, что MemberwiseClone
будет производят только мелкий клон, поэтому он не будет клонировать объекты.
В тех случаях, когда RRProcess
реализует объекты, и вам нужно клонировать их тоже, тогда вам нужно выполнить глубокий клон.
Смотрите этот ответ: https://stackoverflow.com/a/129395/2026276
Вы можете использовать выше для реализации ICloneable
смотрите: https://msdn.microsoft.com/en-us/library/system.icloneable(v=vs.110).aspx
Однако я советую вам в вашем случае, чтобы осуществить это без, потому что Clone()
от ICloneable
только возвращает какой будет объект требуют дополнительного кастинга с вашей стороны, и, возможно, это не стоит в вашем случае.
Что вы тогда можете сделать это:
List<RRProcess> noDuplicates = pSorted
.GroupBy(i => i.pID)
.Select(group => group.First().Clone())
.ToList();
Если вы реализуете ICloneable
List<RRProcess> noDuplicates = pSorted
.GroupBy(i => i.pID)
.Select(group => (RRProcess)group.First().Clone())
.ToList();
'RRProcess' это класс, поэтому ссылочный тип. Вот почему вы меняете элементы в обоих коллекциях. Вам нужно создать новые экземпляры, создав экземпляр-конструктор или назначив все свойства вручную. –
Вы создаете новый список при использовании 'ToList()', я думаю, вы хотите создать «копию» элементов в списке, не так ли? – Fabio
Итак, вы хотите иметь возможность делать что-то вроде 'noDuplicates [0] .Property = 5;' и исходный объект в pSorted не должен отражать это изменение? Если это так, вам придется клонировать объекты в некотором роде. В его нынешнем виде это один и тот же объект в обоих списках, поэтому единственный способ получить то, что вы хотите, состоит в том, чтобы иметь разные объекты в каждом списке. – Chris