Как скопировать наблюдаемую коллекцию - PullRequest
18 голосов
/ 14 ноября 2010

У меня есть

Observablecollection<A> aRef = new Observablecollection<A>();
bRef = aRef(); 

В этом случае оба указывают на одно и то же ObservableCollection ... Как сделать другую копию?

Ответы [ 2 ]

24 голосов
/ 14 ноября 2010

Сделайте это:

// aRef being an Observablecollection 
Observablecollection<Entity> bRef = new Observablecollection<Entity>(aRef);

Это создаст наблюдаемую коллекцию, но элементы все еще указывают на оригинальные элементы.Если вам нужно, чтобы элементы указывали на клон, а не на исходные элементы, вам нужно реализовать и затем вызвать метод клонирования.

ОБНОВЛЕНИЕ

Если вы попытаетесь добавитьк списку, и тогда наблюдаемая коллекция получит исходный список, просто создайте коллекцию Observable, передав первоначальный список:

List<Entity> originalEnityList = GetThatOriginalEnityListFromSomewhere();
Observablecollection<Entity> bRef = new Observablecollection<Entity>(originalEnityList);
10 голосов
/ 05 марта 2014

Вы можете реализовать интерфейс ICloneable в своем определении сущности, а затем сделать копию ObservableCollection с внутренним приведением. В результате вы получите клонированный List без каких-либо ссылок на старые элементы. Тогда вы можете создать свой новый ObservableCollection с клонированным List

public class YourEntity : ICloneable {
    public AnyType Property { get; set; }
    ....
    public object Clone()
    {
        return MemberwiseClone();
    }
}

Реализация будет

var clonedList = originalObservableCollection.Select(objEntity => (YourEntity) objEntity.Clone()).ToList();

ObservableCollection<YourEntity> clonedCollection = new ObservableCollection<YourEntity>(clonedList);
...