c# – UWP – 比较JSON和数据库的数据

前端之家收集整理的这篇文章主要介绍了c# – UWP – 比较JSON和数据库的数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为ebookstore.db的数据库,如下所示:

和JSON如下:

我想当JSON上的slug与数据库中的标题不同时,它将显示带有JSON上的slug的数据量,这与ukomikText中数据库中的标题不同.

码:

string judulbuku;
     try
     {
        string urlPath1 = "https://...";
        var httpClient1 = new HttpClient(new HttpClientHandler());
        httpClient1.DefaultRequestHeaders.TryAddWithoutValidation("KIAT-API-KEY","....");
        var values1 = new List<KeyValuePair<string,string>>
        {
            new KeyValuePair<string,string>("halaman",1),new KeyValuePair<string,string>("limit",100),};

         var response1 = await httpClient1.PostAsync(urlPath1,new FormUrlEncodedContent(values1));
         response1.EnsureSuccessStatusCode();

        if (!response1.IsSuccessStatusCode)
        {
            MessageDialog messageDialog = new MessageDialog("Memeriksa update Komik gagal","Gangguan Server");
            await messageDialog.ShowAsync();
        }
        string jsonText1 = await response1.Content.ReadAsStringAsync();
        JsonObject jsonObject1 = JsonObject.Parse(jsonText1);
        JsonArray jsonData1 = jsonObject1["data"].GetArray();

        foreach (JsonValue groupValue in jsonData1)
        {
            JsonObject groupObject = groupValue.GetObject();

            string id = groupObject["id"].GetString();
            string judul = groupObject["judul"].GetString();
            string slug = groupObject["slug"].GetString();

            BukuUpdate file1 = new BukuUpdate();
            file1.ID = id;
            file1.Judul = judul;
            file1.Slug = slug;

            List<String> title = sqlhelp.GetKomikData();
            foreach (string juduldb in title)
            {
                judulbuku = juduldb.Substring(juduldb.IndexOf('.') + 1);
                if (judulbuku != file1.Slug.Replace("-","_") + ".pdf")
                {
                    BukuData.Add(file1);
                    ListBuku.ItemsSource = BukuData;
                }
                else
                {
                    ukomikText.Text = "belum tersedia komik yang baru";
                    ukomikText.Visibility = Visibility.Visible;
                }
            }
        }
        if (ListBuku.Items.Count > 0)
        {
            ukomikText.Text = BukuData.Count + " komik baru";
            ukomikText.Visibility = Visibility.Visible;
            jumlahbuku = BukuData.Count;
        }
        else
        {
            ukomikText.Text = "belum tersedia komik yang baru";
            ukomikText.Visibility = Visibility.Visible;
        }

 public static List<String> GetKomikData()
        {
            List<String> entries = new List<string>();

            using (sqliteConnection db =
                new sqliteConnection("Filename=ebookstore.db"))
            {
                db.Open();
                sqliteCommand selectCommand = new sqliteCommand
                    ("SELECT title FROM books where folder_id = 67",db);
                sqliteDataReader query = selectCommand.ExecuteReader();
                while (query.Read())
                {
                    entries.Add(query.GetString(0));
                }
                db.Close();
            }
            return entries;
        }

BukuUpdate.cs:

public string ID { get; set; }
public string Judul { get; set; }
public string Slug { get; set; }

我有一个问题,就是当检查JSON上的slu,然后显示的slug是第一个slug在数据库中重复显示尽可能多的数据,之后在数据库上反复显示第二个slug,等等,如下:

如何解决它,以便不重复显示JSON上的slug(根据JSON上的数据量)?

解决方法

问题是你有两个嵌套的foreach循环.代码在简化伪代码中的作用:
For each item in JSON
   Load all rows from DB
   And for each loaded row
      Check if the current JSON item matches the row from DB and if not,output

如您所见,如果数据库中的JSON和M行中有N个项目,则这不可避免地导致N * M行输出,除了那些JSON项目与数据库中的特定行匹配的罕见项目.

如果我理解正确,我假设你想要检查是否有一行与JSON项匹配,如果没有,则输出它.您可以通过以下方式执行此操作:

List<String> title = sqlhelp.GetKomikData();
HashSet<string> dbItems = new HashSet<string>();
foreach (string juduldb in title)
{
    judulbuku = juduldb.Substring(juduldb.IndexOf('.') + 1);
    dbItems.Add( judulbuku );
}

...

foreach ( JsonValue groupValue in jsonData1 )
{
    ...

    //instead of the second foreach

    if ( !dbItems.Contains( file1.Slug.Replace("-","_") + ".pdf" ) )
    {
         //item is not in database
    }
    else
    {
         //item is in database
    }
}

其他提示

>避免在foreach中调用GetKomikData.此方法没有任何参数,这意味着您只是在没有理由的情况下一次又一次地访问数据库,这会花费时间并显着降低执行速度.相反,在第一个foreach之前只调用一次GetKomikData,然后只使用title变量.>每次集合更改时都不要分配ItemsSource.这将不必要地减慢UI线程,因为它将不得不重新加载每个循环的所有项目.相反,只在外部foreach之后分配属性一次>用一种语言编写代码.当你开始用英语和印尼语混合变量名时,代码变得混乱,可读性降低,增加了认知开销.>避免使用非描述性变量名称,如file1或jsonObject1.变量名称应该是明确的,并告诉您它包含的内容.当最后有一个数字时,通常意味着它可以更清楚地命名.>使用复数列表变量名称 – 而不是标题使用标题

猜你在找的C#相关文章