比较两个复杂的数据列表

时间:2019-04-10 01:35:04

标签: c#

当我尝试将当前数据列表保存到数据库中时,我需要从数据库中获取现有数据,并需要与当前数据列表进行比较。

我有两个列表,一个是PreviousList(来自DB的现有数据),另一个是CurrentList(已修改的数据)

    public class SoftClose
{
    public int ID = -1;
    public int AID = -1;
    public int WFID = -1;
    public string PREFIX;
    public DateTime SCDATE;
    public string STATUS;
}

enter image description here

在CurrentList中,我将Prefix修改为D2,其中ID = 1,并添加了新行(Id = 4)...

我的要求是

当我尝试将CurrentList保存到Db时,

  1. 如果CurrentList中有任何新的Prefix,而PreviousList中没有,则需要插入该新行,并将该行的Status更改为ADD。

  2. 我将Prefix更改为D2,其中CurrentList中Id = 1。 D1有DB,但不在CurrentList中,因此我需要删除它。因此,我需要将该记录的状态更改为DELETE。我不应该在id = 1的情况下插入D2记录,因为D2已经存在。如果我更改为Id = 1的D5,则需要插入它,因为D5在数据库中不存在,所以我需要将状态更改为UPDATE。

如何执行此操作?比较列表的最佳方法是什么

2 个答案:

答案 0 :(得分:1)

这是您可以尝试的解决方案:

List<SoftClose> previousList = new List<SoftClose>(){ 
                 new SoftClose(){ID=1, Status = "NO_CHANGE",AID="19", Prefix = "D1"},
                 new SoftClose(){ID=2, Status = "NO_CHANGE",AID="20", Prefix = "D2"},
                 new SoftClose(){ID=3, Status = "NO_CHANGE",AID="21", Prefix = "D3"}
                                                 };

List<SoftClose> currentList = new List<SoftClose>(){ 
                 new SoftClose(){ID=1, Status = "NO_CHANGE",AID="19", Prefix = "D2"},
                 new SoftClose(){ID=2, Status = "NO_CHANGE",AID="20", Prefix = "D2"},
                 new SoftClose(){ID=3, Status = "NO_CHANGE",AID="21", Prefix = "D6"},
                 new SoftClose(){ID=4, Status = "NO_CHANGE",AID="22", Prefix = "D4"},
                 new SoftClose(){ID=5, Status = "NO_CHANGE",AID="22", Prefix = "D5"}
                                                 };


var addlist = currentList.Where(c => previousList.All(p => !p.ID.Equals(c.ID) && !p.Prefix.Equals(c.Prefix)));
foreach(var n in addlist)
{ 
     var index = currentList.FindIndex(p => p.Prefix.Equals(n.Prefix));
     currentList[index].Status = "ADD";
}

var updateORdeletelist = currentList.Where(c => c.Status.Equals("NO_CHANGE") && previousList.Exists(p => p.ID.Equals(c.ID) && !p.Prefix.Equals(c.Prefix)));
foreach (var n in updateORdeletelist)
{
     var index = currentList.FindIndex(p => p.Prefix.Equals(n.Prefix));
     if (previousList.FindIndex(p => p.Prefix.Equals(n.Prefix)) < 0)
          currentList[index].Status = "UPDATE";
     else
          currentList[index].Status = "DELETE";
}

foreach (var item in currentList)
{
     Console.WriteLine($"Id:{item.ID}, Desc1:{item.Prefix}, Status:{item.Status}");  
}

输出

    Id:1, Desc1:D2, Status:DELETE
    Id:2, Desc1:D2, Status:NO_CHANGE
    Id:3, Desc1:D6, Status:UPDATE
    Id:4, Desc1:D4, Status:ADD
    Id:5, Desc1:D5, Status:ADD

答案 1 :(得分:0)

https://www.codeproject.com/Articles/27122/Side-by-Side-SQL-Comparer-in-C处有一个名为 C#并排SQL比较器的工具

该组件的基本用法:

using (TextReader tr = new StreamReader(@"c:\1.sql"))
{
sideBySideRichTextBox1.LeftText = tr.ReadToEnd();
}
using (TextReader tr = new StreamReader(@"c:\2.sql"))
{
sideBySideRichTextBox1.RightText = tr.ReadToEnd();
}
sideBySideRichTextBox1.CompareText();

您将左侧和右侧分别加载到它们各自的变量 sideBySideRichTextBox1.LeftText sideBySideRichTextBox1.RightText 并将它们与 sideBySideRichTextBox1.CompareText(); 进行比较strong>

在您的情况下, 1.sql 2.sql 将是您的PreviousList和CurrentList数据库文件。

在项目现场有更详细的文档。