С# Как лучше всего скопировать BindingList?

Каков наилучший способ скопировать BindingList?

Просто использовать ForEach()? Или есть лучшие способы?


person Martijn    schedule 03.05.2010    source источник
comment
Копировать как? В другой список? Те же экземпляры базовых объектов или клонированные новые экземпляры?   -  person Matt Hamilton    schedule 03.05.2010
comment
Сериализуйте объект, а затем десериализуйте, чтобы получить глубокую клонированную копию без ссылок.   -  person IsmailS    schedule 03.05.2010
comment
Я хочу скопировать все экземпляры в другой список   -  person Martijn    schedule 03.05.2010
comment
Мартин, вам нужна глубокая или поверхностная копия?   -  person Henk Holterman    schedule 03.05.2010
comment
Извините, я не знаком с этими терминами (глубокий и поверхностный)   -  person Martijn    schedule 03.05.2010
comment
Неглубокий: новый список содержит ссылки на старые объекты. Глубокий: новый список получает копии экземпляров.   -  person Henk Holterman    schedule 03.05.2010
comment
А, спасибо. Мне нужна глубокая копия   -  person Martijn    schedule 04.05.2010
comment
Тогда ответ Исмаила ближе всего. Но сначала поищите, глубокое клонирование не так просто, как кажется.   -  person Henk Holterman    schedule 05.05.2010


Ответы (4)


BindingList имеет конструктор, который может принимать IList. И BindingList реализует IList. Итак, вы можете просто сделать следующее:

BindingList newBL = new BindingList(oldBL);

Конечно, при этом создается второй список, который просто указывает на те же объекты. Если вы действительно хотите клонировать объекты в списке, вам придется проделать дополнительную работу.

person RationalGeek    schedule 03.05.2010

Foreach в значительной степени является самым простым способом, и накладные расходы на производительность минимальны, если таковые имеются.

person TomTom    schedule 03.05.2010
comment
А что насчет этого? BindingList list2 = новый BindingList (list1.toList()) - person Martijn; 03.05.2010
comment
Если вы декомпилируете toList, вы увидите, что он делает то же самое;) - person TomTom; 03.05.2010
comment
Это действительно сработало для меня, поэтому я голосую за это решение. - person gab; 23.10.2013

Из удаленного ответа:

Сериализуйте объект, затем десериализуйте, чтобы получить глубокую клонированную копию без ссылок.

Это допустимый вариант, если ОП хочет получить глубокую копию.

person Henk Holterman    schedule 03.05.2010
comment
@Ismail S, я думаю, тебе следует восстановить. - person Henk Holterman; 03.05.2010
comment
Спасибо, что пришли мне на помощь :). Эти люди используют плохие слова против меня. - person IsmailS; 03.05.2010

Мы используем маршрут Serialize/De-serialize, чтобы получить глубокую копию списка. Он работает хорошо, но снижает производительность в больших списках, например, для экранов поиска, поэтому я бы не стал использовать его в списках с более чем 5000 элементов.

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ProjectName.LibraryName.Namespace
{
    internal static class ObjectCloner
    {
        /// 
        /// Clones an object by using the .
        /// 
        /// The object to clone.
        /// 
        /// The object to be cloned must be serializable.
        /// 
        public static object Clone(object obj)
        {
            using (MemoryStream buffer = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(buffer, obj);
                buffer.Position = 0;
                object temp = formatter.Deserialize(buffer);
                return temp;
            }
        }
    }
}

person Shawn    schedule 12.02.2011