Re[4]: Как получить обратный for each?
От: vitz  
Дата: 11.09.06 16:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


V>>Вот и я ща свое БЕ выскажу...


V>>Да ничем foreach пренципиально не лучше, но только если уважеемые госпада вспомнат чем массив от списка отличается?

V>>и если для перебора списка использовать перегруженый индексатор и произвольный доступ через for...
V>>А для массивов использовать итераторы и foreach...
V>>Вот тогда и получится извращение, и дело не в простоте синтаксиса конструкций или еще чего-то там это и есть особенности внутренней организации

L>Что-то никак не пойму чего ты хотел своим сообщением сказать? Можешь расшифровать (для тех, кто в танке)?

Тем кто в танке посвящается:
Хотел сказать, что использовать инструмент нужно по назначению
Re[4]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 04:10
Оценка: -2 :)
foreach не гибок, само то что для различных перечислений требуются различные итераторы уже ставит крест на этом. Я уже не говорю о много поточности, достук к одному итератору в разных потоках сделает бобо. Другое дело индексатор, поддерживает любые фантазии с перечислениями, потоко безопасен и т.д. Поэтому когда я вижу в чьемто сорце итераторы меня сразу тошнит и я дальше без всяких объективных причин не могу смокойно смотреть на этот сорц, и в итоге я этот сорц посылаю фтопку %). Я понимаю, что можно юзать foreach там где без ниго никак, скажем в МС сделали мега класс у которого есть только итератор, но зачем бяку делать в своих сорцах?
Любое удобство идет за счет мегагерцеф!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 04:17
Оценка:
представим мега Grid Control от мега компании за мега цену. Вот я решил в этом гриде сделать цикл чтоб каждый второй элемент стал зеленым, но почемуто разработчики не догадались сделать такой итератор, а индексатора у них и в помине нету, что можно будет тогда сказать о разработчикак этого грида? я бы сказал что они мега бараны.
Любое удобство идет за счет мегагерцеф!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 12.09.06 04:21
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>Вот я решил в этом гриде сделать цикл чтоб каждый второй элемент стал зеленым, но почемуто разработчики не догадались сделать такой итератор,

Хочешь сказать, ты такой итератор сам написать не в состоянии?
Re[5]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 04:44
Оценка:
каким же образом ты добавишь итератор в скомпилированную сборку?

Более того существуют задачи которые с помощью итераторов впринципе решить нельзя. Пример: существует некий класс который предоставляет доступ к объектам с помощью итератора, но в силу решаемой задачи доступ к элементам тебе нужен не последовательный а Random, и как же ты будешь корячиться с помощью foreach в данном случае?
Любое удобство идет за счет мегагерцеф!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 12.09.06 04:57
Оценка: 29 (1) +3
Здравствуйте, Nimnul, Вы писали:

N>каким же образом ты добавишь итератор в скомпилированную сборку?

Зачем мы бы это понадобилось делать. Я вполне обошелся бы статическим методом в классе-утилите.

N>Более того существуют задачи которые с помощью итераторов впринципе решить нельзя.

Ну во-первых, про "нельзя решить в принципе" -- это перебор, т.к. random access iterator через unidirectional iterator эмулируется, правда за линейное число вызовов next.
Во-вторых, -- да, не может корова летать Если у меня будет необходимость в random access-е, то я не буду "корячиться", а возьму подходящую для этого структуру данных.

В общем, ты скажи прямо: все тобой написанное -- это какие-то религиозные соображения или что? Если да, то дальше говорить просто бессмысленно (у меня нет цели кого-то переубеждать).
Если нет, то казалось бы чтение GoF (паттерн итератор), а также общеалгоритмическая эрудиция все без проблем расставляют на место.

Есть как структуры данных с дорогим random access-ом, и быстрым next-ом, так и наоборот. Два крайних представителя: связный список и обычный массив.

Есть и кое что посередине. Скажем, структура данных, которая поддерживает последовательность ключей и позволяет
1) по номеру в последовательности узнать ключ
2) удалить ключ в заданной итератором позиции
3) добавить ключ после заданной итератором позиции
Стандартное решение освновано на применении сбалансированного дерева, тогда сложность первой операции O(log n), а последних двух -- O(1). Тем самым, у нее достаточно эффективный random access. Однако линейный просмотр через random access будет требовать времени порядка n log n, а просмотр через iterator (реализованный через inorder обход дерева) -- всего n. Причем множитель log n на больших коллекциях (скажем, n = 1000000) очень даже ощутим (порядка 20).

Вот такие дела. Нормальному человеку языковые инструменты не должны мешать, если он правильно их применяет.
Re[5]: Как получить обратный for each?
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 12.09.06 05:14
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>представим мега Grid Control от мега компании за мега цену. Вот я решил в этом гриде сделать цикл чтоб каждый второй элемент стал зеленым, но почемуто разработчики не догадались сделать такой итератор, а индексатора у них и в помине нету, что можно будет тогда сказать о разработчикак этого грида? я бы сказал что они мега бараны.


Нифига подобного. Грид — это не Excell, где можно как угодно красить ячейки. В DataGridView можно вручную менять некоторые параметры ячейки, но всё это несерьёзно. Вот, скажем, для увеличения юзабилити нужно в гриде каждую вторую строку делать немного темнее. Что же, придётся подписываться на события добавления, удаления, сортировки и прочие, ради того чтобы заново перекрасить грид? Поэтому удобнее иметь событие, которое вызывается каждый раз, как гриду нужно узнать стиль ячейки и обработчик которого должен самый стиль сообщать.

Ещё одним аргументом против явного указания цветов ячеек служит то, что грид может показывать 1000_000 строк. Поэтому модификация всего этого дела будет занимать немалое время, а хранение цветов — немао памяти.

Кстати, в DataGridView средства для динамического указания стилей неудобны. По мне так проще вот как. Во-первых, зря MS убрали TableStyle'ы. Во-вторых, в TableStyle'е должна быть коллекция StyleSheet некоторых StyleSelector'ов; окончательный стиль формируется таким образом: стиль грида -> стиль таблицы -> стиль столбца -> последовательно стили из StyleSheet. Здесь стрелкой я обозначил последовательное применение стилей к некоторому стилю по-умолчанию. Сами StyleSelector'ы — это пары, где есть предикат и стиль; стиль применяется только если предикат для заданной ячейки возвращает true. Стили должны быть в состоянии явно указать, какие из свойств должны быть унаследованы. Например, свойства шрифта вроде Bold, Italic, Underline — должны быть не bool, а некоторый enum со значениями True/False/Inherit.

Для Excel-подобных контролов уместнее всего было бы сделать итерацию по интервалу ячеек, буквально:

IEnumerable<Cell> GetCells(CellRange range)


А у каждой Cell есть координаты, так что нет проблем всё это покрасить так как нужно.

Не знал, что итерация не потокобезобасна. Вроде как при ней ничего в принципе меняться не может в пределах коллекции, а сами итераторы создаются различные для каждого foreach'а. Так что, если возникают проблемы синхронизации при итерации foreach'ем, то они же возникнут и при for'е. Дело в неправильной архитектуре.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 12.09.06 05:21
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>представим мега Grid Control от мега компании за мега цену. Вот я решил в этом гриде сделать цикл чтоб каждый второй элемент стал зеленым, но почемуто разработчики не догадались сделать такой итератор, а индексатора у них и в помине нету, что можно будет тогда сказать о разработчикак этого грида? я бы сказал что они мега бараны.


Ну ты и тупой .... пример привел.

bool skip = true;
foreach (GridRow row in grid.Rows)
{
  if (!skip)
    row.Color = Colors.Green;
  skip = !skip;
}
Re[5]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 05:40
Оценка:
Lloyd

А каков будет замыслел если нужно выделять разными цветами по четыре строки?
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 12.09.06 05:46
Оценка: :)
Здравствуйте, Nimnul, Вы писали:

N>А каков будет замыслел если нужно выделять разными цветами по четыре строки?


А самому никак подумать не получается?
Re[6]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 05:49
Оценка:
Mab

>Зачем мы бы это понадобилось делать. Я вполне обошелся бы статическим методом в классе-утилите.

Это в ответ на вопрос почему я не могу добавить свой итератор.


>Ну во-первых, про "нельзя решить в принципе" -- это перебор, т.к. random access iterator через unidirectional iterator эмулируется, правда за линейное число вызовов next.

Как то ты быстро проскачил этот момент, а ведь какой ценой будет эта самая эмуляция! Причем цена растет при увеличении количества элементов в коллекции, и при обращении к "дальним" элементам.

>Есть как структуры данных с дорогим random access-ом, и быстрым next-ом, так и наоборот. Два крайних представителя: связный список и обычный массив.


Как правило итераторы удобны в деревьях. А связанный список, я вобще не разу не видел, использованным в дотнете.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 05:53
Оценка:
konsoletyper

Не могу не согласится, что касается грида ты прав, разрисовывать лучше на событиях, но суть не в этом, я показал лишь пример где может возникнуть данная проблема.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 05:56
Оценка:
>>А самому никак подумать не получается?

Я сам уже подумал, но хочу все же увидеть твой вариант и обсудить его в дальнейшем.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 12.09.06 05:56
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>Это в ответ на вопрос почему я не могу добавить свой итератор.

Не можешь потому, что C# 2.0 (в отличие от C# 3.0) этого не позволяет.

N>>Ну во-первых, про "нельзя решить в принципе" -- это перебор, т.к. random access iterator через unidirectional iterator эмулируется, правда за линейное число вызовов next.

N>Как то ты быстро проскачил этот момент, а ведь какой ценой будет эта самая эмуляция! Причем цена растет при увеличении количества элементов в коллекции, и при обращении к "дальним" элементам.
Я это отлично понимаю. Тем не менее, это не делает задуманное "не разрешимым в принципе". Неразрешимость -- более сильная категория.

N>Как правило итераторы удобны в деревьях. А связанный список, я вобще не разу не видел, использованным в дотнете.

Не понял, к чему этот аругмент. Ну не видел ты его использованным, и что?
Re[6]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 06:01
Оценка:
Mab

еще хотел добавить... Вот смотри сам, сколько нужно знать заморочек использую итераторы, что бы не "прогодать", а ведь намного проще использовать просто индексатор и все вопросы отпадают сами собой в том числе и вопросы производительности.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 06:04
Оценка: -2
>>Я это отлично понимаю. Тем не менее, это не делает задуманное "не разрешимым в принципе". Неразрешимость -- более сильная категория.

Лиса цапле тоже предлогала откушать из тарелки

>>Не понял, к чему этот аругмент. Ну не видел ты его использованным, и что?

А то что в других случаях лепить итераторы в своих сорцах просто бессмысленно.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 12.09.06 06:14
Оценка: 1 (1) +3 :)))
Здравствуйте, Nimnul, Вы писали:

Вообще мне всегда казалось, что когда человек не знает этих (вполне элементарных, кстати) "заморочек", то код у него получается... эм... не очень качественный. Но это вопрос вкуса, конечно. Низкооплачиваемые кодеры тоже вполне пользуются спросом.
Re[7]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 06:19
Оценка:
Речь не о том, ты сам можешь забыть коечто в позапарке, что в итоге привет либо к багу в твоей программе либо к большим потерям производительности, когда начнется производственная обкатка твоей проги.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[7]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 12.09.06 06:22
Оценка:
Здравствуйте, Nimnul, Вы писали:

>>>А самому никак подумать не получается?


N>Я сам уже подумал, но хочу все же увидеть твой вариант и обсудить его в дальнейшем.


Мой вариант по поводу твоего примера вообще не должен требовать перебора, т.к. во всех известных мне гридах имеется событие типа CellFormatting-а, в котором и надо производит изменение внешнего вида грида.
Re[8]: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 12.09.06 06:26
Оценка: +2
Здравствуйте, Nimnul, Вы писали:

Лично в моей практике таких проблем не встречалось.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.