You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:54:04