比较两个List<>

本文关键字:List 两个 比较 | 更新日期: 2023-09-27 18:02:50

我有一个gridview控件,上面有一个复选框

当我点击保存按钮时,我能够找到已经被选中的复选框,我能够做到这一点,到目前为止很好,但问题是:

假设用户试图取消选中复选框,那么我将如何跟踪更改并将其保存到已选中的数据库中。anyhelp ? . .所以在这方面,我创建了两个列表进行比较…希望我说的有意义。

我想比较两个列表,如果有任何变化,然后保存....做一些…

<asp:TemplateField HeaderText="Select">  <ItemTemplate>  
      <asp:CheckBox ID="chkSelected" runat="server" Checked="false"></asp:CheckBox>   
</ItemTemplate>  </asp:TemplateField>     

List<Employee> listFromDB = new List<Employee>();
listFromDB = EmployeeListFromDB ; //loads the list
List<Employee> selectedEmployee = new List<Employee>();
selectedEmployee = MySelectedEmployee //loads the list
//Employee object looks like this:
id
name

这是我被卡住的地方,这是我正在做的…

foreach (Employee item in MySelectedEmployee )
{
    bool _flag = false;
    _flag = EmployeeService.SaveEmployee(item.Id, item.Name);
}

比较两个List<>

您想要这样的内容:

var diff = selectedEmployee.Except(listFromDb, (a,b)=>a.id==b.id);
foreach (Employee e in diff)
{
    EmployeeService.SaveEmployee(e.Id, e.Name);
}

但是你非常缺乏细节。什么定义了变化?如何匹配列表中的项目:按id?你的要求能更精确一点吗?

应该这样做:

foreach (Employee item in MySelectedEmployee )
{
   var currentEntry = listFromDB.FirstOrDefault( x => x.id == item.id);
   if(currentEntry == null || currentEntry.name!= item.name)
   {
     bool _flag = EmployeeService.SaveEmployee(item.Id, item.Name);
    ...
   }
}

注意,List<Employee>的初始化是不必要的,因为您无论如何都要在下一行重新分配变量。

听起来您需要的是设置操作。您有几个选择:

。. NET 4.0 - HashSet

http://msdn.microsoft.com/en-us/library/bb359438.aspx

。. NET 3.5 - Linq扩展

对象连接扩展包含一些集合操作,如相交和联合。http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx

。. NET 2.0 - SetList

在2.0中,您将需要手动滚动类似以下SetList类的东西。http://csharptest.net/browse/src/Library/Collections/SetList.cs(在线帮助)

使用SetList:
SetList<Employee> listFromDB = new SetList<Employee>(EmployeeListFromDB);
SetList<Employee> selectedEmployee = new SetList<Employee>(MySelectedEmployee);
SetList<Employee> removed = listFromDB.SubtractSet(selectedEmployee);
SetList<Employee> added = selectedEmployee.SubtractSet(listFromDB);

注意:Employee必须实现IComparable,或者你应该编写一个IComparer并将其提供给上面的SetList构造函数调用。

你应该这样做:

List<Employee> found = EmployeeListFromDB.FindAll(a=>!selectedEmployee.Exists(b=>a.Id == b.Id));

这…