比较两个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);
}
您想要这样的内容:
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
。. 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
你应该这样做:
List<Employee> found = EmployeeListFromDB.FindAll(a=>!selectedEmployee.Exists(b=>a.Id == b.Id));
这…