比较两个List<>

时间:2011-07-20 20:08:49

标签: c# asp.net

我有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);
}

4 个答案:

答案 0 :(得分:2)

你想要这样的东西:

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

但你的细节很糟糕。什么定义了变化?如何匹配列表中的项目:按ID?你能更准确地了解你的要求吗?

答案 1 :(得分:0)

这样的事情应该有效:

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>是不必要的,因为无论如何您都会在下一行重新分配变量。

答案 2 :(得分:0)

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

.NET 4.0 - HashSet&lt; T&gt;

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

.NET 3.5 - Linq扩展

Linq to Objects扩展包含一些设置操作,如Intersect和Union。 http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx

.NET 2.0 - SetList&lt; T&gt;

在2.0中,你需要手动滚动类似下面的SetList类。 http://csharptest.net/browse/src/Library/Collections/SetList.csonline-help

使用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);

注意:员工必须实现IComparable&lt; Employee&gt;,或者您应该编写IComparer&lt; Employee&gt;并将它提供给上面的SetList构造函数调用。

答案 3 :(得分:0)

以下是您的行为:

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

多数民众赞成......