C#where子句通过引用复制对象

时间:2014-04-08 13:59:24

标签: c#

我在c#中有一个列表:

 public class Item
 { 
   public int Id { get; set; }
   public string Name { get; set; }
 }

 List<Item> items = new List<Item>() 
 {
   new Item() { Id = 1, Name = "Item-1" },
   new Item() { Id = 2, Name = "Item-2" },
   new Item() { Id = 3, Name = "Item-3" },
   new Item() { Id = 4, Name = "Item-4" },
   new Item() { Id = 5, Name = "Item-5" },
 };

现在我在上面的项目列表中使用where子句,并获取 Id 大于或等于3的所有项目。

 List<Item> itemsWithIdGreaterThan3 = items.Where(i => i.Id >= 3).ToList();

上面的语句创建了一个新的List,但是它通过引用复制了对象,所以如果我在 itemsWithIdGreaterThan3 列表中更改了任何对象的属性,那么它会反映项目列表中的更改:

 itemsWithIdGreaterThan3[0].Name = "change-item-2"

这也会在项目列表中更改Id = 3的对象。

现在我想要的是克隆对象,所以我找到了选择函数,如:

 List<Item> itemsWithIdGreaterThan3 = items.Where(i => i.Id >= 3)
             .Select(i => new Item() { Id = i.Id, Name = i.Name }).ToList();

这有效,但是如果我有一个对象包含20到30个属性甚至更多。然后,我们必须手动复制每个属性。这个问题有没有快捷方案?

1 个答案:

答案 0 :(得分:1)

您可以为Item创建一个Item作为参数的构造函数。然后,您将进行属性分配。然后从Select

中调用构造函数
public class Item
{ 
  public int Id { get; set; }
  public string Name { get; set; }

  public Item(Item i)
  {
      Id = i.Id;
      Name = i.Name;
      ...
  }
}

List<Item> itemsWithIdGreaterThan3 = items.Where(i => i.Id >= 3)
         .Select(i => new Item(i)).ToList();