如何将test.json的Id与ourOrders的id合并以过滤订单?
扩展订单过滤逻辑:纳入第三方我方订单ID
问题描述
现有C#方法FilterByOurOrders负责过滤订单:遍历region.orders全量订单,对比ourOrders中的订单ID,匹配则标记为我方订单(isOurOrder = true),最终仅保留非我方订单到结果集。现在需要扩展判断规则,将从/test.json读取的第三方我方订单列表(OrdersTimesInfo中的Id)也纳入我方订单判断——只要订单ID匹配ourOrders或第三方订单列表中的任意一个ID,就标记为我方订单并过滤。
实现思路
- 高效存储第三方订单ID:将从JSON读取的第三方订单ID存入
HashSet<string>,利用HashSet的O(1)查找特性提升判断效率,同时指定忽略大小写的比较器,和原逻辑保持一致。 - 合并判断逻辑:在判断订单是否为我方订单时,同时检查
ourOrders列表和第三方订单HashSet,任一匹配则标记为我方订单。 - 保留原有逻辑:维持原有的价格过滤(
price < 1)和byOurOrders开关逻辑不变。
修改后的完整代码
private RegionModel FilterByOurOrders(RegionModel region, List<OurOrderModel> ourOrders, MarketSettings market, bool byOurOrders) { var result = new RegionModel { updatedTs = region.updatedTs, orders = new List<OrderModel>(region.orders.Count) }; // 读取并解析第三方我方订单ID,存入HashSet以提升查找效率 var json = File.ReadAllText("/test.json"); var otherBotOrders = JsonSerializer.Deserialize<OrdersTimesModel>(json); var thirdPartyOurOrderIds = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); if (otherBotOrders?.OrdersTimesInfo != null) { foreach (var orderInfo in otherBotOrders.OrdersTimesInfo) { if (!string.IsNullOrEmpty(orderInfo.Id)) { thirdPartyOurOrderIds.Add(orderInfo.Id); BotController.WriteLine($"{orderInfo.Id}"); } } } foreach (var order in region.orders) { if (ConvertToDecimal(order.price) < 1 || !byOurOrders) { bool isOurOrder = false; // 检查是否匹配我方订单列表 int i = 0; while (i < ourOrders.Count && !isOurOrder) { if (ourOrders[i].id.Equals(order.id, StringComparison.InvariantCultureIgnoreCase)) { isOurOrder = true; } ++i; } // 若未匹配我方订单,再检查第三方我方订单ID集合 if (!isOurOrder) { isOurOrder = thirdPartyOurOrderIds.Contains(order.id); } // 非我方订单才加入结果集 if (!isOurOrder) { result.orders.Add(order); } } } return result; }
关键修改说明
- 第三方ID存储优化:用
HashSet<string>替代原未实际使用的Dictionary,既节省内存又加快查找速度,同时指定StringComparer.InvariantCultureIgnoreCase保证大小写不敏感匹配,和原逻辑对齐。 - 判断逻辑扩展:在原有
ourOrders检查之后,新增第三方订单ID的判断,只要任一条件满足就标记为我方订单。 - 空值安全处理:增加
otherBotOrders?.OrdersTimesInfo != null和!string.IsNullOrEmpty(orderInfo.Id)的空值判断,避免空引用异常。 - 代码简洁性可选优化:原有的while循环可以替换为LINQ的
Any()方法,让代码更简洁:isOurOrder = ourOrders.Any(o => o.id.Equals(order.id, StringComparison.InvariantCultureIgnoreCase));
内容的提问来源于stack exchange,提问作者Humster
相关产品推荐
相关产品推荐

