2016-12-29 100 views
0

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

这两个文件都是基于json的文件,在下面给出的“ITEMS”对象中解析。我正在使用Visual Studio 2015与C#。后端是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 
     } 
    } 
} 

回答

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); 
} 
+0

是的。纠正。 –

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几次。

+1

谢谢。纠正。复制到stackoverflow时是错误的。 –

1

如果名单真的compareable,他们具有完全相同的格式,说item.updated_at C#提供了使用功能交叉或除“原生地”比较清单的可能性;

请记住,程序不会检查可信度,所以如果你认为你已经正确地通过数组循环并且仍然得到错误的结果,我会开始检查数据,如果这可能是问题。

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

首先调试循环并使用Expression-Checker(或简单的OzCode)来自行比较列表。

此外,我是比较Id的,而不是使用时间戳的粉丝。如果它们兼容。

两个有用的链接:

Intersect Two Lists in C#

The opposite of Intersect()

+0

这些lambda表达式对我来说太复杂了。所以我尝试做foreach循环。谢谢你的帮助。 –

+0

你能帮我写出那段代码吗? –