如何高效从已排序C# List中按属性筛选子集?
基于有序List的高效筛选方案
核心逻辑:既然
element_list已经按size升序排好序,所有满足size < size_threshold的元素肯定集中在列表前半段。不用遍历整个集合,直接用二分查找定位到第一个大于等于阈值的元素索引,再通过GetRange()截取前半段子集,时间复杂度从O(n)降到O(log n),重复执行时效率提升非常明显。具体代码实现:
借助List.BinarySearch方法,配合自定义比较器就能快速定位索引:// 假设你的元素类型为Element,包含int类型的size属性 var sizeComparer = Comparer<Element>.Create((a, b) => a.size.CompareTo(b.size)); // 创建一个用于查找的虚拟元素,size设为阈值 var thresholdMarker = new Element { size = size_threshold }; // 执行二分查找 int splitIndex = element_list.BinarySearch(thresholdMarker, sizeComparer); // 处理查找结果:没找到匹配元素时,返回值是负数,取补码得到第一个大于阈值的元素索引 if (splitIndex < 0) { splitIndex = ~splitIndex; } // 截取前splitIndex个元素,就是所有size小于阈值的子集 var result = element_list.GetRange(0, splitIndex);为什么放弃Dictionary?因为Dictionary是哈希结构,不维护元素的顺序,完全无法利用原List已排序的特性,自然达不到高效筛选的目的。
内容的提问来源于stack exchange,提问作者For Comment
相关产品推荐
相关产品推荐

