Поскольку ob
является классом, это ссылочный тип и, следовательно, любой экземпляр ob
при назначении другой переменной (как это происходит в строке ob item = t.Where(c => c.name == "hello").First();
) будет автоматически скопируйте ссылку в исходный экземпляр, а не копируйте сам фактический экземпляр. Это общая тема .NET, касающаяся копирования объектов, и она отделена от LINQ / Lambda,
Чтобы достичь желаемого, вам необходимо создать Shallow Copy или Deep Copy результирующего экземпляра из вашей проекции LINQ.
Для вашего ob
класса достаточно мелкой копии (ShallowCopy обычно копирует как можно меньше, тогда как DeepCopy копирует все - Хорошую ссылку на различия можно найти здесь ).
Чтобы выполнить ShallowCopy объекта, вы можете использовать просто MemberwiseClone
, который является встроенным методом типа объекта .NET, унаследованным всеми объектами.
Для чего-то более существенного вам придется реализовать собственную функцию DeepCopy, но это может быть относительно просто. Нечто похожее на эти реализации, как указано здесь и здесь .