【问题标题】:After simple Linq-Foreach List is null在简单的 Linq-Foreach 列表为空之后
【发布时间】:2015-05-15 07:24:38
【问题描述】:

我现在很奇怪! 我想删除我的 ObservableCollection 的一些 ViewModel:

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

代码运行良好——我得到了正确的虚拟机等等。但在我的foreach 之后,VMs_ToDelete 列表为空。

为什么?

谢谢!

【问题讨论】:

  • 你没有显示你在哪里初始化VMs_ToDelete。它从未填充到您显示的代码中。

标签: c# wpf linq foreach


【解决方案1】:

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();

【讨论】:

    【解决方案2】:

    这两个系列都诉诸相同的参考。集合 VMs_ToDelete 中的每个元素都对 AllConnections 中的元素具有相同的引用。 如果您从 AllConnection 集合中移除此元素,您也会将他从 VMs_ToDelete 集合中移除,因为您正在移除源元素。

    在 linq 查询中,LINQ 机制中存在延迟执行和延迟评估 = https://msdn.microsoft.com/en-us/library/bb943859.aspx

    您可以通过从此查询创建例如列表或数组来解决此问题(.Tolist()、.ToArray() 等)

    【讨论】:

      【解决方案3】:

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

      因此,如果您在从源中删除项目后执行查询,显然不会找到任何项目,因为它们已准备好删除。

      要解决此问题,请在查询后附加一个 .ToList(),以便在 VMs_Delete 变量中获得结果而不是查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        相关资源
        最近更新 更多