Robilem cos w pracy i musialem zmodyfikowac kolekcje. Slabo mi to szlo. W koncu sie udalo, ale chcialbym wiedziec czemu moj pierwszy pomysl nie zadzialal
using System;
using System.Collections.ObjectModel;
using System.Linq;
public class Foo
{
public string Name;
public Foo() { }
}
public class Test
{
private static ObservableCollection<Foo> _fooCollection = new ObservableCollection<Foo>();
public ObservableCollection<Foo> FooCollection
{
get
{
var validParents = from p in _fooCollection
select new Foo();
return new ObservableCollection<Foo>(validParents); //_toolboxComponents;
}
}
public static void Main()
{
_fooCollection.Add(new Foo { Name = "a"});
_fooCollection.Add(new Foo { Name = "b" });
_fooCollection.Add(new Foo { Name = "c" });
_fooCollection.Add(new Foo { Name = "d" });
_fooCollection.Add(new Foo { Name = "e" });
System.Console.WriteLine(_fooCollection.Count);
ObservableCollection<Foo> copy = new ObservableCollection<Foo>(_fooCollection);
foreach (var foo in copy)
{
if (foo.Name == "ToBeRemoved")
{
_fooCollection.Remove(foo);
}
}
_fooCollection.Add(new Foo { Name = "ToBeRemoved" });
System.Console.WriteLine(_fooCollection.Count);
foreach (var foo in copy)
{
if (foo.Name == "ToBeRemoved")
{
_fooCollection.Remove(foo);
}
}
System.Console.WriteLine(_fooCollection.Count);
}
}
output jest 5, 6, 6 a jednak myslalem ze powinno byc 5, 6, 5
Jednak gdy zmienie warunek na np "b" albo "d" to kolekcja nie ma problemu z usuwaniem. Ma tylko problem z nowym pozniejszym dodanym elementem ToBeRemoved.
Jednak gdy zamienie ten foreach na zwyklego for to bez problemu usuwa.
Pytanie moje. Czemu to sie tak dzieje?
EDIT
Jeszcze takie pytanie czy takie usuwanie jest ok?
for (int index = 0; index < _toolboxComponents.Count; index++)
{
if (_toolboxComponents[index].Category == "UserComponents")
{
_toolboxComponents.RemoveAt(index);
index--;
}
}
W pracy mowia ze to jest ok, ale ja mam watpliwosci z C++ :)