比较两个相同类型的列表

时间:2019-04-09 20:04:51

标签: c#

我需要比较两个相同类型的列表。假设我有以下课程的CurrentSC List(当前由用户修改的数据)和PreviousSC List(从数据库保存的数据)。

public class SoftClose
{
    private int AID = -1;
    private bool _softCloseInd;
    private bool _softCloseEditInd;
    private string _softClosedBy;
    private DateTime _softClosedDate;
    private ReferenceEnums.ActionStatus _status = ReferenceEnums.ActionStatus.NO_CHANGE;
}

        public static void TPostProcessAddRemoveSoftCloseStopPaymentPrefixes(IFPMServiceInternal fpmService, AgreementRevision revision)
    {
        List<SoftClose> psc = null;
        List<SoftClose> csc = null;
        string fanValue = revision.Agreement.FAN;

        psc = fpmService.GetSoftCloseByFAN(fanValue);
        if (psc != null)
        {
            //var currentprefixes = revision.Details.Where(x => x.Prefix != null).Select(y => y.Prefix).Distinct();

            //Create current SoftClose object using revision object
            foreach (var prefix in revision.Details.Where(x => x.Prefix != null).Select(y => y.Prefix).Distinct())
            {
                var newSF =
                      new SoftClose
                      {
                          Id = -1,
                          Status = ReferenceEnums.ActionStatus.NO_CHANGE,
                          AgreementRevId = revision.Id,
                          AgreementId = revision.Agreement.Id,
                          WorkflowStatus = revision.WorkflowStatus,
                          FAN = revision.Agreement.FAN,
                          PID = (int)revision.Agreement.PID,
                          Prefix = prefix
                      };

                csc.Add(newSF);
            }

            //Now you have previous and current softcloses to compare prefixes...
            psc.OrderBy(x => x.Prefix.Id);
            csc.OrderBy(x => x.Prefix.Id);

            for(int i = 0; i < csc.Count; i++)
            {

            }
        }
    }

enter image description here

假设我已将PreviousSC中的D3值更改为CurrentSC中的D2。现在,我需要从数据库中删除D3值(因为数据库中已经有D2值了,所以我不需要插入),并将_status更改为DELETE,我在CurrentSC中添加了D4值,而在SC中没有PreviousSC。现在,我需要在数据库中添加D4值,并将_softCloseInd和_softCloseEditInd分配给Y,并将_status更改为ADD。

如何以最佳方式实现这一目标?

1 个答案:

答案 0 :(得分:0)

    class Program
{
    static void Main(string[] args)
    {
        List<SoftClose> psc = 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"},
             new SoftClose(){ID=3, Status = "NO_CHANGE",AID=22, Prefix = "D9"}
                                             };

        List<SoftClose> csc = new List<SoftClose>(){
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=19, Prefix = "D2"},
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=20, Prefix = "D2"},
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=21, Prefix = "D6"},
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=22, Prefix = "D4"},
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=23, Prefix = "D5"},
             new SoftClose(){ID=-1, Status = "NO_CHANGE",AID=24, Prefix = "D3"}
                                             };

        List<SoftClose> esc = new List<SoftClose>();

        Console.WriteLine("---------Previous List----------");
        foreach (var item in psc)
        {
            Console.WriteLine($"Id:{item.ID}, Desc1:{item.Prefix}, Status:{item.Status}");
        }
        Console.WriteLine("--------------------------------------");
        Console.WriteLine("---------Current List----------");
        foreach (var item in csc)
        {
            Console.WriteLine($"Id:{item.ID}, Desc1:{item.Prefix}, Status:{item.Status}");
        }
        Console.WriteLine("--------------------------------------");

        var addlist = csc.Where(c => psc.All(p => !p.Prefix.Equals(c.Prefix)));
        foreach (var n in addlist)
        {
            var index = csc.FindIndex(p => p.Prefix.Equals(n.Prefix));
            csc[index].Status = "ADD";
            esc.Add(csc[index]);
        }

        var deletelist = psc.Where(p => p.Status.Equals("NO_CHANGE") && !csc.Exists(c => c.Prefix.Equals(p.Prefix)));
        foreach (var n in deletelist)
        {

            var index = psc.FindIndex(c => c.Prefix.Equals(n.Prefix));
            if (psc.FindIndex(c => c.Prefix.Equals(n.Prefix)) >= 0)
            {
                psc[index].Status = "REMOVE";
                esc.Add(psc[index]);
            }
        }

        Console.WriteLine("---------Effective List----------");
        foreach (var item in esc)
        {
            Console.WriteLine($"Id:{item.ID}, Prefix:{item.Prefix}, Status:{item.Status}");
        }

        Console.ReadLine();
    }
}

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