简单Linq-Foreach后,List为空

本文关键字:List 为空 Linq-Foreach 简单 | 更新日期: 2023-09-27 17:49:15

我现在很奇怪!我想删除我的ObservableCollection的一些视图模型:

    var AllConnectedPlugs = from VM_Element in AllElements
                            from Plug in VM_Element.Element.AllPlugs
                            where VMs_ToDelete.Any(VM_Connection => VM_Connection.Connection.SourcePlug == Plug || VM_Connection.Connection.DestinationPlug == Plug)
                            select Plug;
    MessageBox.Show(VMs_ToDelete.ToList().Count.ToString()); //x
    AllConnectedPlugs.ToList().ForEach(Plug => Plug.Connection = null);
    MessageBox.Show(VMs_ToDelete.ToList().Count.ToString()); //0
    VMs_ToDelete.ToList().ForEach(VM_Connection => AllConnections.Remove(VM_Connection));

代码工作正常-我得到正确的VM等等。但是在我的foreach之后,列表VMs_ToDelete是空的。

为什么?

谢谢!

简单Linq-Foreach后,List为空

AllConnectedPlugs连接为IEnumerable,因此每次访问它时都执行它。将Connection赋值为null后,查询返回空集合。这将解决您的问题:

var AllConnectedPlugs = (from VM_Element in AllElements
                        from Plug in VM_Element.Element.AllPlugs
                        where VMs_ToDelete.Any(VM_Connection => VM_Connection.Connection.SourcePlug == Plug || VM_Connection.Connection.DestinationPlug == Plug)
                        select Plug).ToList();

两个集合调用相同的引用。集合VMs_ToDelete中的每个元素在AllConnections中都有相同的元素引用。如果您从AllConnection集合中删除该元素,您也将从VMs_ToDelete集合中删除该元素,因为您正在删除源元素。

linq查询中存在延迟执行和延迟求值= https://msdn.microsoft.com/en-us/library/bb943859.aspx.

您可以通过从这个查询(.Tolist(), .ToArray()等)创建列表或数组来解决这个问题

VMs_ToDelete变量是一个查询,而不是查询的结果。当您请求它时,您将获得结果,例如,通过使用. tolist()。

因此,如果在从源中删除项后执行查询,显然不会找到任何项,因为它们已经被删除了。

要解决这个问题,在查询之后附加一个. tolist(),这样您就可以在VMs_Delete变量中获得结果而不是查询。