如何高效为列表中指定ID的对象设置selected属性
高效批量设置对象selected属性的方案
嘿,这个问题问到点子上了!如果用嵌套遍历(比如先循环idList,再在theObjects里找对应ID的对象),当两个列表的数据量比较大时,效率会很低——毕竟每次查找都是O(n)的时间,总复杂度是O(n*m),数据量上去了肯定会卡。
咱们可以用**哈希集合(HashSet)**来优化,直接把时间复杂度降到O(n+m),具体步骤如下:
1. 把ID列表转换成HashSet
HashSet的Contains方法是O(1)的时间复杂度,比在普通List里查找快得多。代码很简单:
var targetIds = new HashSet<int>(idList);
2. 遍历对象列表批量设置属性
只需要遍历一次theObjects,对每个对象判断它的ID是否在HashSet里,是的话就把selected设为true:
foreach (var obj in theObjects) { obj.selected = targetIds.Contains(obj.id); }
如果喜欢用LINQ的简洁写法,也可以这样(不过foreach的性能略优,因为LINQ会有少量额外开销):
theObjects.ForEach(obj => obj.selected = targetIds.Contains(obj.id));
为什么这个方法更高效?
- 构建HashSet的时间是O(m)(m是
idList的长度) - 遍历对象列表的时间是O(n)(n是
theObjects的长度) - 总时间复杂度是O(n+m),对比嵌套遍历的O(n*m),在数据量大的时候性能提升非常明显。
另外补充一句:如果你的theObjects里的ID是唯一标识(通常ID都是唯一的),这个方法完全没问题;就算有重复ID,只要ID在idList里,对应的所有对象都会被正确设置selected为true。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

