1

我正在尝试根据更新时间(保存在数据库中)下载基于服务器的文件(PDF)。在下载之前,我想将它们与本地机器上的现有文件列表进行比较。问题是比较对象字段给出了错误的输出。

这两个文件都是基于 json 的文件,在下面给出的“ITEMS”对象中解析。我正在使用带有 C# 的 Visual Studio 2015。后端是 Laravel REST。

class Items
{
    public int id { get; set; }
    public string branch { get; set; }
    public string item { get; set; }
    public string link { get; set; }
    public int active { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }
}

这就是我解析服务器和本地列表(均为 JSON)的方式:

for (int i = 0; i < obj.Count; i++)
{
     JObject row = JObject.Parse(obj[i].ToString());
     Items newItem = new Items();
     newItem.id = int.Parse(row["id"].ToString());
     newItem.branch = row["branch"].ToString();
     newItem.item = row["item"].ToString();
     newItem.link = row["link"].ToString();
     newItem.created_at = row["created_at"].ToString();
     newItem.updated_at = row["updated_at"].ToString();
     files.Add(newItem);
}

我正在使用 foreach 循环来检查 updated_at 字段是否相等

// Compare files

foreach (Items item in files)
{  
    foreach(Items it in filesToDownload)
    {
        if (!it.updated_at.Equals(item.updated_at))
        {
        //Download the file
        //Create a new list of files to download
        }
    }
}
4

3 回答 3

1
for (int i = 0; i < obj.Count; i++)
{
    JObject row = JObject.Parse(obj[i].ToString());
    Items newItem = new Items();
    newItem.id = int.Parse(row["id"].ToString());
    newItem.item = row["branch"].ToString();
    newItem.link = row["item"].ToString();
    newItem.item = row["link"].ToString();
    newItem.item = row["created_at"].ToString();
    newItem.item = row["updated_at"].ToString();
    files.Add(newItem);
}

您正在item为所有变量设置属性。

尝试:

for (int i = 0; i < obj.Count; i++)
{
    JObject row = JObject.Parse(obj[i].ToString());
    Items newItem = new Items();
    newItem.id = int.Parse(row["id"].ToString());
    newItem.branch = row["branch"].ToString();
    newItem.item = row["item"].ToString();
    newItem.link = row["link"].ToString();
    newItem.created_at = row["created_at"].ToString();
    newItem.updated_at = row["updated_at"].ToString();
    files.Add(newItem);
}
于 2016-12-29T11:55:22.953 回答
1

如果列表确实可比较并且它们具有完全相同的格式,例如 item.updated_at C# 提供了使用函数相交或除外来“本机”比较列表的可能性;

请记住,该程序不会检查合理性,因此,如果您认为循环遍历数组已经正确并且仍然得到错误的结果,那么如果这可能是问题,我将首先检查数据。

因为看起来 foreach 循环会像 Intersect 和 except 一样做。

首先调试循环并使用表达式检查器(或像 OzCode 这样的简单工具)自行比较列表。

我也喜欢比较 Id 而不是使用时间戳。如果它们兼容。

两个有用的链接:

C#中的两个列表相交

Intersect() 的反面

于 2016-12-29T11:58:45.890 回答
0

我认为您只是复制+粘贴太多... =)

for (int i = 0; i < obj.Count; i++)
{
     JObject row = JObject.Parse(obj[i].ToString());
     Items newItem = new Items();
     newItem.id = int.Parse(row["id"].ToString());
     newItem.item = row["branch"].ToString();
     newItem.link = row["item"].ToString();
     newItem.item = row["link"].ToString();
     newItem.item = row["created_at"].ToString();
     newItem.item = row["updated_at"].ToString();
     files.Add(newItem);
}

你重复newItem.item了好几次。

于 2016-12-29T11:54:53.217 回答