比较两个ObservableCollections中的项目

时间:2016-12-20 11:37:59

标签: c# wpf observablecollection

我有两个ObservableCollections,一个包含当前员工列表,另一个包含新员工。如果新员工包含的员工不在旧列表中,我想将其添加到旧列表中。

如果新列表中的旧列表中不包含员工,我想将其从旧列表中删除。 (我希望这是有道理的)。

这是我尝试过的;

foreach (var employee in _currentUsers.ToList())
{
    if (!newUsers.Contains(employee))
    {
        Dispatcher.Invoke(() =>
        {
            _currentUsers.Remove(employee);
            CurrentUsageDataGrid.Items.Refresh();                      
        });
    }
}

foreach (var employee in newUsers)
{
    if (!_currentUsers.Contains(employee))
    {
        Dispatcher.Invoke(() =>
        {
            _currentUsers.Add(employee);
            CurrentUsageDataGrid.Items.Refresh();
        });
    }
}

即使我知道列表没有改变,Dispatcher.Invoke()仍在解雇,但这不起作用。我是否误解了Contains的运作方式和/或是否有“更好”的方式来执行这样的检查?

2 个答案:

答案 0 :(得分:1)

您的员工类是否实现IEquatable<T>接口,包含ObservableCollection的方法将在该接口中使用Equal来比较对象。 否则,您可能需要使用Linq来检查现有员工,而不是使用Contains

有关MSDN的更多参考,https://msdn.microsoft.com/en-us/library/ms132407(v=vs.100).aspx

答案 1 :(得分:1)

如上所述,您需要实现/覆盖Equal方法进行比较。当您对2个类对象执行“包含”检查时,它会检查2个对象是否相等(而不是它们的属性是否相同)。您可以使用id执行相等操作,也可以计算哈希值并进行比较。