[c#][linq] Преобразовать одну коллекцию в другую с "добавлен
От: nikda  
Дата: 28.07.17 07:34
Оценка:
Нужно преобразовать одну коллекцию в другую с "добавлением" номера элемента.
Сделал так:
int index = 0;
IEnumerable<DestType> destItems = srcItems
    //.AsParallel()
    .Select(si=> new DestType(si.Name, index++));

Затем нужна параллельная обработка — сделал через .AsParallel().

Корректно ли это решение? Например смущает index++ при параллельной обработке.
Может сделать через Interlocked.Increment(ref index)? Или другой способ

PS. Номер — должен быть уникальным, последовательность необязательна.
Отредактировано 28.07.2017 7:36 nikda . Предыдущая версия .
Re: [c#][linq] Преобразовать одну коллекцию в другую с "добавлен
От: Sinix  
Дата: 28.07.17 07:50
Оценка: 1 (1) +1
Здравствуйте, nikda, Вы писали:

N>Нужно преобразовать одну коллекцию в другую с "добавлением" номера элемента.


Есть перегрузка
.Select((s,i) => ...).


Если производительность является проблемой настолько, что вынуждает использовать AsParallel(), я бы начал с продумывания общей логики и использования более легковесного диспатчинга, Parallel.For() с partitioning, как вариант. Не забываем, что приложение редко живёт в вакууме. Отжираем проц => его не хватает кому-то ещё
Re[2]: [c#][linq] Преобразовать одну коллекцию в другую с "добавлен
От: nikda  
Дата: 28.07.17 08:26
Оценка:
Спасибо.
А как узнать действительно ли выполнялась параллельная обработка. Номера в выводе получились последовательными, а в другом варианте (Interlocked.Increment(ref index)) — не последовательные.
Re[3]: [c#][linq] Преобразовать одну коллекцию в другую с "добавлен
От: Sinix  
Дата: 28.07.17 08:32
Оценка: +1
Здравствуйте, nikda, Вы писали:

N>Спасибо.

N>А как узнать действительно ли выполнялась параллельная обработка.
Зависит от кода. Как вариант, один из кусков навешивает номера _до_ того, как раскидывает элементы по потокам.

Я начал бы с вопроса "а зачем?". Из опыта, почти всегда хаки "а вот тут мы параллелим, потому что можем" редко дают ожидаемый результат, чаще наоборот. Диспатчинг, особенно на холодном или уже забитом пуле потоков — штука небесплатная.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.