我在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个属性甚至更多。然后,我们必须手动复制每个属性。这个问题有没有快捷方案?
答案 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();