ObservableCollection nie usuwa pozniej dodanych elementow

0

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++ :)

0

Dlatego ponieważ nie tworzysz swojej kolekcji copy jako referencji do _fooCollection, tylko jako nowy obiekt utworzony na podstawie _fooCollection (poprzez konstruktor kopiujący).

0

przeciez nie chce tworzyc referencji do obiektu tylko chce stworzyc kopie...
Nie usuwam z Kopii tylko z oryginalu. A kopie tworze po to by nie modyfikowac kolecji podczas dzialania foreach! a gdyby bylo tak jak piszesz, to czemu w takim razie przedtem dodane obiekty (name = "b" np) bedzie usuniety?

3

Usuwasz z orginału, ale iterujesz w foreach'u, po elementach kopi. Jeżeli iterujesz po elementach kopi, to jak chcesz żeby znalazł się tam element dodany do orginału?

0

@Pszep masz racje, w tym przykladzie. Jednak ja mialem ze ta kopie tworzylem za kazdym razem przed foreach loop wiec kopia znajdywala obiekt (i wywolywala funkcje Remove na oryginale) ale jej nie usuwala... wiec pewnie cos gdzies indziej cos dziwnego sie dzieje. No nie wazne. Wazne ze remove dziala normalnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1