簡體   English   中英

比較兩個復雜的數據列表

[英]Compare Two Complex List of data

當我嘗試將當前數據列表保存到數據庫中時,我需要從數據庫中獲取現有數據,並需要與當前數據列表進行比較。

我有兩個列表,一個是 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;
}

在此處輸入圖片說明

在 CurrentList 中,我將 Prefix 修改為 D2,其中 ID=1 並添加了新行(Id=4)...

我的要求是

當我嘗試將 CurrentList 保存到 Db 時,

  1. 如果 CurrentList 中有任何在 PreviousList 中沒有的新前綴,我需要插入該新行並需要將該行的 Status 更改為 ADD。

  2. 我在 CurrentList 中將 Prefix 更改為 D2,其中 Id = 1。 D1 是有 DB 而不是在 CurrentList 中,所以我需要刪除它。 所以我需要將該記錄的狀態更改為 DELETE。 我不應該在 id=1 的地方插入 D2 記錄,因為 D2 已經存在。 如果我更改為 D5,其中 Id = 1,那么我需要插入它,因為 D5 不在 DB 中所以我需要將狀態更改為 UPDATE。

這該怎么做? 比較列表的最佳方法是什么

這是您可以嘗試的解決方案:

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

https://www.codeproject.com/Articles/27122/Side-by-Side-SQL-Comparer-in-C 中有一個名為Side by Side SQL Comparer 的 C#工具。

組件的基本用途:

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.LeftTextsideBySideRichTextBox1.RightText並將它們與sideBySideRichTextBox1.CompareText()進行比較

在您的情況下, 1.sql2.sql將是您的 PreviousList 和 CurrentList 數據庫文件。

項目現場有更詳細的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM