C#中如何将同类型List的指定属性复制到另一个List
解决方案:更新现有对象的指定属性,而非创建新对象替换列表
你遇到的问题核心是ConvertAll会创建全新的MyClass实例,直接替换掉旧列表里的所有对象,自然保留不了原来的age属性。要实现"只更新部分属性、保留其他属性"的需求,我们需要直接修改旧列表里已有的对象,而不是生成新对象替换它们。
情况1:新旧列表元素按索引一一对应
如果你的myOldList和newList的元素数量相同,且位置对应的元素需要更新(比如你的示例场景),用普通循环最直接:
for (int i = 0; i < myOldList.Count; i++) { var existingItem = myOldList[i]; var newData = newList[i]; // 只更新需要替换的属性 existingItem.id = newData.id; existingItem.name = newData.name; // age属性完全不动,保持原来的15 }
运行这段代码后,myOldList里的元素就会变成你期望的:id:3 name:xyz age:15。
情况2:根据特定字段(比如id)匹配更新
如果新旧列表的元素不是按索引对应,而是需要根据id这样的唯一标识找到对应的旧对象更新,可以结合LINQ来实现:
foreach (var newItem in newList) { // 根据id找到旧列表里对应的对象 var matchingOldItem = myOldList.FirstOrDefault(item => item.id == newItem.id); if (matchingOldItem != null) { // 只更新指定属性 matchingOldItem.name = newItem.name; // 如果需要更新id也可以加这行,看你的业务需求 // matchingOldItem.id = newItem.id; } }
这种方式适合需要按业务标识匹配更新的场景,避免了索引对应限制。
关键提醒
一定要注意:这里修改的是旧列表中已存在的对象实例,而不是创建新对象。这样就能完美保留原对象中未被修改的属性(比如age),完全解决你之前的问题。
内容的提问来源于stack exchange,提问作者Santosh




