如何在c#中使用linq / lambda获取数据副本而不是引用?

是否有一种简单的方法可以基本上只使用此方法获取数据的副本而不是引用? 我试过.ToArray()。Where()但似乎仍然传递了一个引用。

例:

static void Main(string[] args) { List t = new List(); t.Add(new ob() { name = "hello" }); t.Add(new ob() { name = "test" }); ob item = t.Where(c => c.name == "hello").First(); // Changing the name of the item changes the original item in the list item.name = "burp"; foreach (ob i in t) { Console.WriteLine(i.name); } Console.ReadLine(); } public class ob { public string name; } 

你需要自己创建一个ob的副本 – 这不是LINQ提供的。

您可以基于现有protected MemberwiseClone方法定义Clone方法:

 public class Item { public Item Clone() { return (Item)this.MemberwiseClone(); } } 

然后:

 ob item = t.Where(c => c.name == "hello").First().Clone(); 

由于ob是一个类,因此它是一个引用类型 ,因此当分配给另一个变量时,它是ob任何实例(正如在行ob item = t.Where(c => c.name == "hello").First(); )会自动将引用复制到原始实例,而不是复制实际的实例本身。 这是关于对象复制的一般.NET主题,与LINQ / Lambda是分开的,

为了实现您想要的效果,您需要从LINQ投影中创建生成实例的浅复制或深层复制 。

对于你的ob类,一个浅拷贝就足够了(ShallowCopy通常尽可能少地复制,而DeepCopy会复制所有东西 – 这里可以找到差异的一个很好的参考)。

要执行对象的ShallowCopy,您可以使用简单的MemberwiseClone ,它是.NET对象类型的内置方法,由所有对象inheritance。

对于更实质的东西,您必须实现自己的DeepCopyfunction,但这可能相对简单。 类似于这里和这里指定的这些实现的东西。

一个更简单的方法是简单地将数据序列化为json然后再返回。 它需要很小的性能,但它更安全,因为它不易出错,您不需要修改所有类。

干得好:

 var json = JsonConvert.SerializeObject(myObject) var clone = JsonConvert.DeserializeObject(json)