You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C#中如何将同类型List的指定属性复制到另一个List

解决方案:更新现有对象的指定属性,而非创建新对象替换列表

你遇到的问题核心是ConvertAll会创建全新的MyClass实例,直接替换掉旧列表里的所有对象,自然保留不了原来的age属性。要实现"只更新部分属性、保留其他属性"的需求,我们需要直接修改旧列表里已有的对象,而不是生成新对象替换它们。

情况1:新旧列表元素按索引一一对应

如果你的myOldListnewList的元素数量相同,且位置对应的元素需要更新(比如你的示例场景),用普通循环最直接:

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

火山引擎 最新活动