Конвертация списков
От: Chardex Россия  
Дата: 08.01.07 12:56
Оценка:
Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.
Re: Конвертация списков
От: Константин Л. Турция  
Дата: 08.01.07 13:02
Оценка:
Здравствуйте, Chardex, Вы писали:

C>Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.


ConvertAll
Re: Конвертация списков
От: desco США http://v2matveev.blogspot.com
Дата: 08.01.07 13:02
Оценка:
Здравствуйте, Chardex, Вы писали:

C>Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.


List.ConvertAll ?
http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif
Re: Конвертация списков
От: _FRED_ Россия
Дата: 08.01.07 13:05
Оценка:
Здравствуйте, Chardex, Вы писали:

C>как наиболее быстро произвести конвертацию из List<A> в List<B>.


Копированием.
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: Конвертация списков
От: Denis2005 Россия  
Дата: 08.01.07 13:08
Оценка:
Здравствуйте, Chardex, Вы писали:

C>Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.


Копированием:

List<int> li = new List<int>(new int[]{1, 2, 3, 4});
List<string> ls = li.ConvertAll(new Converter<int, string>(delegate(int i) { return "_" + i.ToString(); }));
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Конвертация списков
От: Mab Россия http://shade.msu.ru/~mab
Дата: 08.01.07 13:21
Оценка: +2
Здравствуйте, Chardex, Вы писали:

C>Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.

Зависит от того, какие здесь A и B.
Re[2]: Конвертация списков
От: Chardex Россия  
Дата: 08.01.07 14:13
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Зависит от того, какие здесь A и B.

Ну про копирование и ConvertAll я и сам знаю
B наследует A.
Re[3]: Конвертация списков
От: Mab Россия http://shade.msu.ru/~mab
Дата: 08.01.07 14:22
Оценка: 12 (2) +1
Здравствуйте, Chardex, Вы писали:

C>B наследует A.

Можно вызвать ToArray() у первого списка, а затем создать новый на основе этого массива, воспользовавшись ковариантностью. К сожалению, у List нет конструктора, принимающего массив и использующего его далее в качестве backing storage. Сделано это скорее всего по соображениям дуракоустойчивости (иначе пользовать получает доступ к приватным данным листа).

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

Решение с делегатами скорее всего медленнее обоих способов. Насколько именно -- профайлер в руки.
Re: Конвертация списков
От: TK Лес кывт.рф
Дата: 08.01.07 14:36
Оценка: 1 (1)
Здравствуйте, Chardex, Вы писали:

C>Добрый день, подскажите пожалуйста, как наиболее быстро произвести конвертацию из List<A> в List<B>.


А почему-бы не использовать IList<A> и IList<B> при таком раскладе создание враппера IList<N> будет делом техники независимо от того, как соотносятся A и B
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: Конвертация списков
От: _FRED_ Россия
Дата: 08.01.07 15:30
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>К сожалению, у List нет конструктора, принимающего массив и использующего его далее в качестве backing storage. Сделано это скорее всего по соображениям дуракоустойчивости (иначе пользовать получает доступ к приватным данным листа).


Скорее всего специально для того, чтоб List<> не использовали для каких-либо хитрых трюков. Для этого есть Collection<>. Всё полезное, что есть в List<> (помимо реализации IList<>) — это всякие методы типа AsArray, ForEach, ConvertAll, …которые отлично реализуются стронними статическими методами, которым, в большенстве, случаев достаточно IEnumerable<> или даже нетипизированного IEnumerable.
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Конвертация списков
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.01.07 16:01
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Решение с делегатами скорее всего медленнее обоих способов. Насколько именно -- профайлер в руки.


Ага. Только еще надо понимать, что понятие "быстро" очень относительно. Так что в первую очередь имеет смысл спросить о размере массива и частоте его преобазования. Если элементов не миллионы или конвертация вызывается не стотни тысяч раз в секунду, то боязнь за скорость скорее всего банальная фобия.

Так что лучше все же сделать как проще/компактнее, а уж потом если что профайлер в руки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Конвертация списков
От: Chardex Россия  
Дата: 08.01.07 19:06
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, Chardex, Вы писали:


C>>B наследует A.

Mab>Можно вызвать ToArray() у первого списка, а затем создать новый на основе этого массива, воспользовавшись ковариантностью.

        public List<SysObject> LoadAll(Type type)
        {
            //....
        }
        public List<T> LoadAll<T>() where T : SysObject
        {
            return new List<T>((T[])LoadAll(typeof(T)).ToArray());
        }

Кидает исключение, что не может преобразовать массивы.
Re[5]: Конвертация списков
От: Mab Россия http://shade.msu.ru/~mab
Дата: 08.01.07 19:38
Оценка:
Здравствуйте, Chardex, Вы писали:

C>Кидает исключение, что не может преобразовать массивы.

Не удивительно, т.к. здесь происходит downcast, а ковариантность массивов работает в обратную сторону. Увы, я невнимательно прочитал исходное сообщение. Придется использовать другие способы.
Re[2]: Конвертация списков
От: Chardex Россия  
Дата: 08.01.07 19:42
Оценка:
Здравствуйте, TK, Вы писали:

TK>А почему-бы не использовать IList<A> и IList<B> при таком раскладе создание враппера IList<N> будет делом техники независимо от того, как соотносятся A и B.

Не могли бы Вы попобробнее рассказать.
Re[3]: Конвертация списков
От: TK Лес кывт.рф
Дата: 08.01.07 21:24
Оценка:
Hello, "Chardex"
>
> TK>А почему-бы не использовать IList<A> и IList<B> при таком раскладе создание враппера IList<N> будет делом техники независимо от того, как соотносятся A и B.
> Не могли бы Вы попобробнее рассказать.

Класс List<T> это вполне конкретный объект который подразумевает хранение данных. Тогда как, интерфейс это всего лишь доступ к ним. т.е. если метод возвращает List<int> то это значит то, что будет выдан объект хранящий в себе массив int. Если же использовать IList<int> то, это более слабое условие т.к можно вернуть как и сам List<int> так и какой-нибудь ReadOnlyList<int>

Что касается использования врапперов то, можно воспользоваться примером из PowerCollections:
Wintellect.PowerCollections.Algorithms.TypedAs<B>(new List<A>());
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.