2014-09-28 76 views
1

删除一个项目,我想从一个ObservationCollection<City>.从分层集合

删除city我曾尝试:

private static void DeleteCity(List<City> cities, City cityToDelete) 
{ 
    City nodeToDelete = null; 

    foreach (var city in cities) 
    { 
     if (city.permanentId == cityToDelete.permanentId) 
     { 
      nodeToDelete = city; 
      break; 
     } 
     DeleteCity(city.Children.ToList(), cityToDelete); 
    } 
    if (nodeToDelete != null) 
    { 
     cities.Remove(nodeToDelete); 
     return; 
    } 
} 

public static void SomeFunction(...................) 
{ 
    ...... 
    ...... 
    ...... 

    DeleteCity(ServiceLocator.Instance.Cities.ToList(), cityToMove); 

    .... 
    .... 

}

当我保持一个断点return;DeleteCity方法。我可以看到cityToDelete的传入值从城市中删除。但是当我进一步调用函数时,我可以看到ServiceLocator.Instance.Cities仍然保持着这个特定的城市。为什么它不会从该集合中删除该城市?

+0

你似乎正在通过你想要移动的城市.. – 2014-09-28 22:54:01

+0

你的DeleteCity(...,...)方法做什么? – 2014-09-28 22:54:35

+0

@kirsteng我相信我正在通过正确的城市。 – Vishal 2014-09-28 22:55:51

回答

6

ServiceLocator有您从列表中删除的城市,因为您调用了ToList(),这会强制将原始数据复制到新列表中。从副本删除条目对原始列表没有影响,说明您看到的行为。

此外,当您递归调用方法时,还可以通过调用Children属性上的ToList()来制作副本。因此,从列表的副本中删除,而不是从原始的删除。原始收藏保持不变。

+1

谢谢。现在它像一个魅力。根据stackOverFlow规则,我将在7分钟后接受答案。 – Vishal 2014-09-28 22:59:18