如何用LinQ优化列表匹配过滤逻辑?现有嵌套循环方案待改进
优化嵌套循环的LINQ方案
嘿,这个嵌套循环确实可以优化得更简洁高效!尤其是当列表数据量变大时,嵌套O(n*m)的时间复杂度会拖慢性能,用LINQ结合字典查找能把复杂度降到O(n+m),同时代码逻辑更清晰。
优化思路
- 先构建快速查找字典:把列表B(
p)转换成以id为键、status为值的字典,这样后续查找对应ID的状态时,能直接通过键快速定位,避免重复遍历。 - 遍历更新状态:遍历列表A(
_items.FlashItems),用字典的TryGetValue安全查找对应ID的状态,如果状态不是"publish"就更新列表A的项,同时弹出提示。 - 过滤最终数据源:最后用LINQ的
Where过滤出状态为"publish"的项,作为购物车数据源。
优化后的代码
// 将列表p转换为字典,key是id,value是status,实现O(1)快速查找 var statusLookup = p.ToDictionary(item => item.id, item => item.status); // 遍历FlashItems,批量处理状态更新 foreach (var flashItem in _items.FlashItems) { // 安全查找对应ID的状态,避免KeyNotFoundException if (statusLookup.TryGetValue(flashItem.PId, out var targetStatus) && targetStatus != "publish") { await DisplayAlert("Sale Over!", $"Sorry the Sale for {flashItem.Name} has ended, Removing Item from you cart", "Ok"); flashItem.status = targetStatus; } } // 过滤出符合条件的购物车数据 cartView.ItemsSource = _items.FlashItems.Where(z => z.status == "publish").ToList();
为什么这个方案更好?
- 性能提升:字典的查找操作是O(1),相比嵌套循环的O(n*m),当列表元素较多时,性能差距会非常明显。
- 代码可读性:去掉了嵌套循环,逻辑分层更清晰,一眼就能看出“构建查找表→更新状态→过滤数据”的流程。
- 安全性:用
TryGetValue替代直接字典索引,避免了列表A中存在但列表B中没有的ID引发异常。
内容的提问来源于stack exchange,提问作者Azurry
相关产品推荐
相关产品推荐

