比较列表和可观察集合,并从可观察集合中删除差异

我正在尝试解决一些现有代码的问题,我正在研究从列表构建ObservableCollection的位置,但是随着从第一个列表中删除项目(从头开始重新生成项目)时,它们不会从ObservableCollection中删除。该列表作为DLL的一部分生成,而ObservableCollection在exe文件的一部分中,并且通过使用委托/事件/调用在两者之间传递数据。该列表指向包含索引的类,该索引可以唯一地标识该类的每个实例。

该代码如下所示:

动态链接库

List<CarInfo> _entryListCars = new List<CarInfo>();

_entryListCars.Clear();
var carEntryCount = br.ReadUInt16();
for (int i = 0; i < carEntryCount; i++)
{
    _entryListCars.Add(new CarInfo(br.ReadUInt16()));
}

定期运行以上代码以重新创建entryList并使其保持最新。

CarInfo结构看起来像这样:

public class CarInfo
{
    public ushort CarIndex { get; }
    ....
}

可执行程序

使用委托事件将这些数据从DLL传递到EXE之后,将在ViewModel中创建ObservableCollection,如下所示:

public ObservableCollection<CarViewModel> Cars { get; } = new ObservableCollection<CarViewModel>();

private void MessageHandler_OnEntrylistUpdate(string sender, CarInfo carUpdate)
{
    CarViewModel vm = Cars.SingleOrDefault(x => x.CarIndex == carUpdate.CarIndex);
    if (vm == null)
    {
        vm = new CarViewModel(carUpdate.CarIndex);
        Cars.Add(vm);
    }
    vm.Update(carUpdate);
}

然后,在xaml文件中使用Cars在CollectionViewSource的WPF GUI中的条目列表中显示Cars的列表。

问题:

DLL中的_entryListCars总是被更新且准确,因为它经常被清除并重新更新。新出现的汽车已成功添加到Cars ObservableCollection中,但是断开连接/死亡的汽车不再是_entryListCars的一部分,则永远不会从Cars ObservableCollection中移除。它只是越来越大,并继续显示失效/不活动的汽车。

我的问题:

从Cars ObservableCollection移除失效/失效的汽车的最佳方法是什么?我想知道我是否能够使用Except(list1.Except(list2))比较两个列表,然后使用可能包含在CarIndex上的包含和删除_entryListCars列表中不在Cars ObservableCollection中的所有汽车条目。 Cars.Remove / RemoveAt / RemoveItem?实现此目标的最佳方法是什么,代码将是什么样?

谢谢你的帮助。

评论