比较c#中两个不同列表中的每个项

本文关键字:列表 比较 两个 | 更新日期: 2023-09-27 18:15:53

我有两个项目列表,

public class DataExcel
{
    public String Name{ get; set; }
    public String Color { get; set; }
    public String Comments { get; set; }
    public String Management { get; set; }
}
// before inserting data into DB i am fetching all the values into a List
//This method will get all the details from Db
List<DataExcel> dBUpdate = GetAllExistingDrugList();
//some logic to insert data into DB                 
//After inserting the data again i am fetching all the values into another List
List<DataExcel dBUpdate1  = GetAllExistingDrugList();

现在我想比较dBUpdatedBUpdate1,如果药物名称相同,但其他详细信息已被修改,则应显示已修改和插入的药物的计数。

在第一次插入中,我插入

1。名称:"A"颜色:"红色"评论:"第一次插入"管理:"慢"

2。名称:"B"颜色:"绿色"评论:"第二次插入"管理:"慢"

第二次插入

1。名称:"A"颜色:"绿色"评论:"第一次插入"管理:"慢"

2。名称:"B"颜色:"绿色"评论:"第二次插入"管理:"慢"

在第二次插入中,我将A的颜色从"红色"改为"绿色",现在我应该显示更新计数为1。

有谁能帮我一下吗

比较c#中两个不同列表中的每个项

我真的不知道这是否是最好的方法。但这是最简单的,也是我首先想到的:

int UpdateCount = 0;
foreach (DataExcel item in dBUpdate)
{
    if(!dBUpdate1.Contains(item))
    {
       UpdateCount++;
    }
}

可以这样做:

var count = (from d1 in dBUpdate join d2 in dBUpdate1 on d1.Name equals d2.Name
                where d1.Color != d2.Color || d1.Comments != d2.Comments || d1.Management != d2.Management
                select d1).Count();

两个列表连接,但只有当d1和d2具有相同的名称,并且在颜色,评论或管理中有不同的条目时。所以这是一个所有被改变的药物的列表,在最后简单地计数。

你可以试试这个:

// counter
int updatedRecords = 0;
foreach(var dataExcel in dBUpdate)
{
    // Find the associated record for the dataExcel in the second list.
    var dataExcel1 = dBUpdate1.SingleOrDefault(x=>x.Name==dataExcel.Name);
    // If the associated record found check if anything changed 
    // to it's properties values.
    if(dataExcel1!=null)
    {
        // If any change has been made, update the counter.
        if(dataExcel1.Color!= dataExcel.Color || 
           dataExcel1.Comments != dataExcel.Comments || 
           dataExcel1.Management != dataExcel.Management )
            updatedRecords++;
    }
}
int count = 0;
dBUpdate.ForEach(dbu =>
{
       dBUpdate1.Where(dbu1 => dbu1.Name.Equals(dbu.Name)).ToList().ForEach(dbu11 =>
       {
              if (!dbu11.Color.Equals(dbu.Color) || !dbu11.Comments.Equals(dbu.Comments) || 
                        !dbu11.Management.Equals(dbu.Management))
                 {
                    count++;
                 }
        });
});
We can use linQ expressions also.