更新IEnumerable子集合元素属性会同步更新主集合吗?
问题解答
1. A中对应元素的属性会同步更新吗?
会。因为A.Where(x => x.Status == "N")返回的B并不是新创建的Price对象集合,而是原集合A中符合条件元素的引用视图。Price作为引用类型(类),A和B中的元素指向的是堆内存里的同一个实例。所以你遍历B修改元素的Date和Status属性时,本质上是直接修改了A中对应元素的实例属性,A里的元素自然会同步更新。
2. 基于B更新A中匹配元素的最优方式(针对值类型或新创建对象的场景)
如果你的场景中B是新创建的Price对象集合(而非原A的引用视图),或者Price是值类型,就可以利用你已实现的IEqualityComparer<Price>来高效匹配更新:
方式一:遍历B查找匹配元素更新(适合小型集合)
var priceComparer = new YourCustomPriceEqualityComparer(); foreach (var bPrice in B) { // 从A中找到匹配元素 var aPrice = A.FirstOrDefault(a => priceComparer.Equals(a, bPrice)); if (aPrice != null) { aPrice.Date = bPrice.Date; aPrice.Status = bPrice.Status; } }
方式二:转字典批量匹配更新(适合大型集合,提升效率)
如果A和B元素数量较多,先把B转成以元素为键的字典,利用哈希查找大幅提升匹配速度:
var priceComparer = new YourCustomPriceEqualityComparer(); var bPriceDict = B.ToDictionary(price => price, priceComparer); foreach (var aPrice in A) { if (bPriceDict.TryGetValue(aPrice, out var matchedBPrice)) { aPrice.Date = matchedBPrice.Date; aPrice.Status = matchedBPrice.Status; } }
如果A是List<Price>类型,用List.Find()替代FirstOrDefault,性能会更优。
内容的提问来源于stack exchange,提问作者user3121062
相关产品推荐
相关产品推荐

