C#遍历线上数据集存SQLite时ID不连续,如何按行号遍历?
修复方案
核心问题说明
你当前的逻辑错误在于:已经提前将符合Surface分类的所有数据过滤、按ID排序后存入了assetsPrelim列表,完全不需要按ID数值遍历,直接遍历该列表的每一项即可,天然规避ID不连续的问题。
原有代码还存在大量冗余问题:按ID遍历遇到断号会插入全默认值的脏数据、每次循环重复创建数据库连接、重复建表、重复查询本地全表计数,性能极低。
优化后完整代码
private async void updateAssetRegisterLocal() { try { var current = Connectivity.NetworkAccess; if (current != NetworkAccess.Internet) { await DisplayAlert("无网络连接", "请移动到有手机信号的位置后重试", "OK"); return; } UserDialogs.Instance.ShowLoading(); // 用using包裹HttpClient,避免资源泄漏 using (HttpClient client = new HttpClient()) { var response = await client.GetStringAsync("https://XXXX.azurewebsites.net/api/assets"); var onlineAssets = JsonConvert.DeserializeObject<List<AssetRegister>>(response); // 过滤、排序得到所有需要的Surface分类数据 var assetsPrelim = onlineAssets .Where(w => w.Asset_Category == "Surface") .OrderBy(d => d.ID) .ToList(); // 统一数据库操作,只开一次连接 using (SQLiteConnection conn = new SQLiteConnection(App.FilePath)) { // 删旧表、建新表,仅执行一次 try { conn.DropTable<AssetRegister>(); } catch { await DisplayAlert("操作失败", "无法访问本地数据库", "OK"); return; } conn.CreateTable<AssetRegister>(); // 开启事务批量插入,性能远高于逐次插入 conn.BeginTransaction(); try { // 直接遍历已经过滤好的列表,完全不需要关心ID是否连续 foreach (var asset in assetsPrelim) { AssetRegister arl = new AssetRegister() { ID = asset.ID, Asset_ID = asset.Asset_ID, Asset_Type = asset.Asset_Type, Asset_Category = asset.Asset_Category, Road_ID = asset.Road_ID, Road_Hierarchy = asset.Road_Hierarchy, AssetSegmentString = asset.AssetSegmentString, Inspection_Due = asset.Inspection_Due, StdRoadID = asset.StdRoadID, Lat = asset.Lat, Lon = asset.Lon, Last_Inspection_Date = asset.Last_Inspection_Date, }; conn.Insert(arl); } conn.Commit(); } catch { conn.Rollback(); throw; } } await DisplayAlert("操作成功", "设备本地资产登记已更新", "OK"); } } catch { await DisplayAlert("错误", "无法获取数据,请联系系统管理员", "OK"); } finally { // 统一在finally里关闭加载弹窗,避免异常时弹窗不消失 UserDialogs.Instance.HideLoading(); } }
主要优化点
- 直接遍历已过滤排序的
assetsPrelim列表,彻底解决ID不连续导致的遍历异常问题,不会出现漏数据、插入空数据的问题 - 统一数据库连接操作,全程仅创建一次连接,避免重复创建连接的性能开销
- 新增事务批量插入,插入效率提升数十倍
- 优化异常处理逻辑,加载弹窗统一在
finally中关闭,避免异常时弹窗常驻 - 移除所有冗余的查询、匹配、建表逻辑,代码更简洁易维护
内容的提问来源于stack exchange,提问作者Tricky035
相关产品推荐
相关产品推荐

