You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ对比同类型对象列表并更新Amount属性

用LINQ实现列表匹配ID并更新Amount的方案

当然可以轻松用LINQ搞定这个需求!我给你两种实用的实现方式,适配不同的场景:

1. 直接修改原列表(引用类型适用)

如果你的对象是引用类型(比如class),可以用Join高效关联两个列表的匹配项,然后直接修改原列表里的对象属性:

首先先定义你的对象类型(示例):

public class Item
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Amount { get; set; } // 金额推荐用decimal避免精度问题
}

然后执行匹配和更新:

// 假设listA和listB是已经初始化好的Item列表
var matchedPairs = listA.Join(
    listB,
    itemA => itemA.ID,    // listA的匹配键是ID
    itemB => itemB.ID,    // listB的匹配键也是ID
    (itemA, itemB) => new { A = itemA, B = itemB } // 把配对的两个对象打包
);

// 遍历配对结果,更新listA里的Amount
foreach (var pair in matchedPairs)
{
    pair.A.Amount -= pair.B.Amount;
}

这种方式效率很高,因为Join内部用哈希表实现,时间复杂度是O(n+m),适合数据量大的场景。而且因为是引用类型,修改的就是原listA里的对象,不需要额外生成新列表。

2. 生成新列表(不修改原数据)

如果你不想改动原列表,想要生成一个全新的结果列表,可以用Select结合FirstOrDefault:

var resultList = listA.Select(itemA => 
{
    // 找到listB中ID匹配的项
    var matchedItemB = listB.FirstOrDefault(itemB => itemB.ID == itemA.ID);
    
    // 生成新对象,计算新的Amount(没匹配到就保留原Amount)
    return new Item
    {
        ID = itemA.ID,
        Name = itemA.Name,
        Amount = matchedItemB != null ? itemA.Amount - matchedItemB.Amount : itemA.Amount
    };
}).ToList();

这种方式更安全,不会影响原列表的数据,但如果列表数据量很大,FirstOrDefault会逐个遍历listB,时间复杂度是O(n*m),效率不如第一种方法,适合小数据量或者需要保留原数据的场景。

注意事项

  • 如果你的对象是值类型(struct),第一种直接修改的方式就不适用了,因为值类型是值传递,修改的是副本,这时候必须用第二种方法生成新列表。
  • 如果能确保listA里的每个ID都在listB中存在,可以去掉matchedItemB != null的判断,但保留的话代码容错性更好。

内容的提问来源于stack exchange,提问作者djedjica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:54