简单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是空的。
为什么?
谢谢!
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变量中获得结果而不是查询。