【问题标题】:Loop through dataset by row number按行号循环数据集
【发布时间】:2021-09-24 06:11:56
【问题描述】:

我有一个在线数据集,我正在循环将其保存到 sqlite 数据库。它运行良好,但是它顺序循环的“计数”基于 ID 列,但是在某些情况下,ID(对于我正在过滤的类别)不是顺序的。如果可能的话,我宁愿遍历行号或类似的东西——但我似乎找不到办法。以下是我的代码:

注意计数从 793 开始,因为这是第一个“表面”分类记录的 ID

private async void updateAssetRegisterLocal()
        {
            try
            {
                var current = Connectivity.NetworkAccess;

                if (current != NetworkAccess.Internet)
                {
                    await DisplayAlert("No Internet Connectivity", "Move to a location with mobile coverage and try again", "OK");
                }

                else
                {

                    UserDialogs.Instance.ShowLoading();

                    HttpClient client = new HttpClient();

                    var response = await client.GetStringAsync("https://XXXX.azurewebsites.net/api/assets");

                    var onlineAssets = JsonConvert.DeserializeObject<List<AssetRegister>>(response);

                    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("Unsuccessful", "Can't Access", "OK");
                        }
                    }

                    for (int count = 793; count <= (assetsPrelim.Count + 793); count++)
                    {
                        var assets = assetsPrelim.Where(x => x.ID == count);
                        var id = assets.Select(l => l.ID).FirstOrDefault();
                        var asset_ID = assets.Select(l => l.Asset_ID).FirstOrDefault();
                        var road_ID = assets.Select(l => l.Road_ID).FirstOrDefault();
                        var segmentString = assets.Select(l => l.AssetSegmentString).FirstOrDefault();
                        var hierarchy = assets.Select(l => l.Road_Hierarchy).FirstOrDefault();
                        var assetCategory = assets.Select(l => l.Asset_Category).FirstOrDefault();
                        var lat = assets.Select(l => l.Lat).FirstOrDefault();
                        var inspectionDue = assets.Select(l => l.Inspection_Due).FirstOrDefault();
                        var lon = assets.Select(l => l.Lon).FirstOrDefault();
                        var stdRoadId = assets.Select(l => l.StdRoadID).FirstOrDefault();
                        var assetType = assets.Select(l => l.Asset_Type).FirstOrDefault();
                        var inspectionDate = assets.Select(l => l.Last_Inspection_Date).FirstOrDefault();

                        using (SQLiteConnection con = new SQLiteConnection(App.FilePath))
                        {
                            con.CreateTable<AssetRegister>();
                            var assetsLocal = con.Table<AssetRegister>().ToList();

                            int arlID = assetsLocal.Count + 1;

                            AssetRegister arl = new AssetRegister()
                            {
                                ID = id,
                                Asset_ID = asset_ID,
                                Asset_Type = assetType,
                                Asset_Category = assetCategory,
                                Road_ID = road_ID,
                                Road_Hierarchy = hierarchy,
                                AssetSegmentString = segmentString,
                                Inspection_Due = inspectionDue,
                                StdRoadID = stdRoadId,
                                Lat = lat,
                                Lon = lon,
                                Last_Inspection_Date = inspectionDate,

                            };

                            using (SQLiteConnection conn = new SQLiteConnection(App.FilePath))
                            {
                                conn.CreateTable<AssetRegister>();
                                int rowsAdded = conn.Insert(arl);
                                conn.Close();
                            }
                        }
                    }

                    await DisplayAlert("Success", "Asset Register Updated on Device", "OK");
                    UserDialogs.Instance.HideLoading();
                }
            }

            catch
            {
                await DisplayAlert("Error", "Could not get data - Report to System Adminstrator", "OK");
                UserDialogs.Instance.HideLoading();
            }
        }

【问题讨论】:

  • 所以你得到了一个包含一堆 id 的数据集,其中可能有 1000 个,介于 5 到 2000 之间,到处都是空白,你只想插入那些 id 高于 793 的数据吗?

标签: c# for-loop


【解决方案1】:

看起来您可以使用 foreach 简单地循环迭代 而不是

for (int count = 793; count <= (assetsPrelim.Count + 793); count++)
{
  var assets = assetsPrelim.Where(x => x.ID == count);
  var id = assets.Select(l => l.ID).FirstOrDefault();
  var asset_ID = assets.Select(l => l.Asset_ID).FirstOrDefault();
  var road_ID = assets.Select(l => l.Road_ID).FirstOrDefault();
  var segmentString = assets.Select(l => l.AssetSegmentString).FirstOrDefault();
  var hierarchy = assets.Select(l => l.Road_Hierarchy).FirstOrDefault();
  var assetCategory = assets.Select(l => l.Asset_Category).FirstOrDefault();
  var lat = assets.Select(l => l.Lat).FirstOrDefault();
  var inspectionDue = assets.Select(l => l.Inspection_Due).FirstOrDefault();
  var lon = assets.Select(l => l.Lon).FirstOrDefault();
  var stdRoadId = assets.Select(l => l.StdRoadID).FirstOrDefault();
  var assetType = assets.Select(l => l.Asset_Type).FirstOrDefault();
  var inspectionDate = assets.Select(l => l.Last_Inspection_Date).FirstOrDefault();
  ...

你可以拥有

foreach (var asset in assetsPrelim)
{
  var id = asset.ID;
  var asset_ID = asset.Asset_ID;
  var road_ID = assets.Road_ID;
  var segmentString = asset.AssetSegmentString;
  var hierarchy = asset.Road_Hierarchy;
  var assetCategory = asset.Asset_Category;
  var lat = asset.Lat;
  var inspectionDue = asset.Inspection_Due;
  var lon = asset.Lon;
  var stdRoadId = asset.StdRoadID;
  var assetType = asset.Asset_Type;
  var inspectionDate = asset.Last_Inspection_Date;
  ...

【讨论】:

  • 感谢您在@Quercus 上帮助我。非常感谢
【解决方案2】:

只需使用foreach() 代替for() 循环,

for (var asset in assetsPrelim)
{
  var id = asset.Id;
  var asset_ID = asset.Asset_ID;
  var road_ID = assets.Road_ID;

  //...
   
}

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2015-02-07
    • 2018-12-19
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2020-12-22
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多