Как получить обратный for each?
От: Alexander_fx  
Дата: 08.09.06 11:07
Оценка:
for each dd as mycls in mycollection
next dd

Как полуить обратную последовательность?
Re: Как получить обратный for each?
От: Mab Россия http://shade.msu.ru/~mab
Дата: 08.09.06 11:27
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

Руками. Либо использовать PowerCollections и комбинацию Algorithms.ToArray, Algorithms.Reverse.
RE: Как получить обратный for each?
От: Аноним  
Дата: 08.09.06 12:07
Оценка:
for each dd as mycls in mycollection
next dd

Как полуить обратную последовательность?

на крайний случай можно отсортировать таблицу в обратном порядке и пробежатся по ней


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 03:48
Оценка:
ыы вот они недостатки forearch %)
Любое удобство идет за счет мегагерцеф!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Как получить обратный for each?
От: ie Россия http://ziez.blogspot.com/
Дата: 11.09.06 04:14
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>ыы вот они недостатки forearch %)


недостаток можно найти в любом инструменте
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re: Как получить обратный for each?
От: Красин Россия  
Дата: 11.09.06 04:19
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>ыы вот они недостатки foreach %)


Напиши трактат о невсеприменимости foreach
Re: Как получить обратный for each?
От: Lloyd Россия  
Дата: 11.09.06 05:55
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>for each dd as mycls in mycollection

A_>next dd

A_>Как полуить обратную последовательность?


А зачем непременно foreach? Беги for-ом.
Re: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 06:38
Оценка: -2
угу поддерживаю for рулит
Любое удобство идет за счет мегагерцеф!


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

N>угу поддерживаю for рулит


Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 11:27
Оценка:
for each dd as mycls in mycollection
next dd

Как полуить обратную последовательность?

Добавить в mycollection новый property ReverseOrder as IEnumerable
далее пишем
for each dd as mycls in mycollection.ReverseOrder

Забудьте for как страшный сон.
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 12:29
Оценка:
Здравствуйте, erigami, Вы писали:

E>Забудьте for как страшный сон.

Откуда это пошло? И чем foreach принципиально лучше, он же то же самое делает, нет? А если мне через одну надо перебрать, или по условию, на каждый чих по итератору писать?
Re[2]: Как получить обратный for each?
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 11.09.06 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:

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


E>>Забудьте for как страшный сон.

А>Откуда это пошло? И чем foreach принципиально лучше, он же то же самое делает, нет? А если мне через одну надо перебрать, или по условию, на каждый чих по итератору писать?

Вот во что разворачивается foreach (V v in x) embedded-statement:

{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}


О самом паттерне (в терминологии Gof Enumerator это Iterator):

Паттерн Iterator
Название и классификация паттерна

Итератор — паттерн поведения объектов.

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


Отсюда и делайте выводы — чем же foreach лучше for.
Re[2]: Как получить обратный for each?
От: RustM Россия  
Дата: 11.09.06 12:48
Оценка: -1
Здравствуйте, <Аноним>, Вы писали:

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


E>>Забудьте for как страшный сон.

А>Откуда это пошло? И чем foreach принципиально лучше, он же то же самое делает, нет?
Товарищ пересел с C++ или

А>А если мне через одну надо перебрать, или по условию

А чем мешает этому foreach
... << RSDN@Home 1.2.0 alpha rev. 655>>
Re[2]: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 12:57
Оценка:
for vs. foreach предлагаю создать сайт на эту тему с доменом типа
for.net, foreach.net, forFans.org, foreachFans.org ...

моё мнение нужен и for и foreach) только foreach не всегда можно использовать (к примеру если нужно менять коллекцию), но у него свои плюсы перед for.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 13:09
Оценка:
И чем foreach принципиально лучше, он же то же самое делает, нет?
Он принципиально лучше тем, что каждому, кто видит в коде конструкцию foreach очевидно, что она делает.
Ее достаточно трудно использовать с ошибкой.
В то время, как ошибки в использовании конструкции for это классика, синдром плюс минус единица это раз, нужно знать, какое свойство, Count или Length использовать, это два.
А если мне через одну надо перебрать, или по условию, на каждый чих по итератору писать?
Это будет правильно, если создатель коллекции позаботится о типовых методах доступа к ней.
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 14:07
Оценка:
Здравствуйте, pt4h, Вы писали:

P>Назначение

P>Предоставляет способ последовательного доступа ко всем элементам состав-
P>ного объекта, не раскрывая его внутреннего представления.
P>[/q]

P>Отсюда и делайте выводы — чем же foreach лучше for.


И зачем это нужно для работы со списком или массивом? Понятие о "внутреннем представлении" этих объектов мне кажется надуманным, а разработка на каждый чих (например, обратный перебор или перебор с условием) нового итератора — излишней и не продуктивной. А если надо несколько переборов на много элементов с одинаковым условием делать, писать кэширующий итератор или просматривать весь список каждый раз?
Поверьте, я не ругаюсь, я просто не понимаю.
Re[2]: Как получить обратный for each?
От: vitz  
Дата: 11.09.06 14:20
Оценка:
Здравствуйте, erigami, Вы писали:

E>И чем foreach принципиально лучше, он же то же самое делает, нет?

E>Он принципиально лучше тем, что каждому, кто видит в коде конструкцию foreach очевидно, что она делает.
E>Ее достаточно трудно использовать с ошибкой.
E>В то время, как ошибки в использовании конструкции for это классика, синдром плюс минус единица это раз, нужно знать, какое свойство, Count или Length использовать, это два.
E>А если мне через одну надо перебрать, или по условию, на каждый чих по итератору писать?
E>Это будет правильно, если создатель коллекции позаботится о типовых методах доступа к ней.

E>
данное сообщение получено с www.gotdotnet.ru

E>ссылка на оригинальное сообщение

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

Да ничем foreach пренципиально не лучше, но только если уважеемые госпада вспомнат чем массив от списка отличается?
и если для перебора списка использовать перегруженый индексатор и произвольный доступ через for...
А для массивов использовать итераторы и foreach...
Вот тогда и получится извращение, и дело не в простоте синтаксиса конструкций или еще чего-то там это и есть особенности внутренней организации
Re[4]: Как получить обратный for each?
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 11.09.06 14:24
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


P>>Назначение

P>>Предоставляет способ последовательного доступа ко всем элементам состав-
P>>ного объекта, не раскрывая его внутреннего представления.
P>>[/q]

P>>Отсюда и делайте выводы — чем же foreach лучше for.


Мне кажется задачи, которые решаются при помощи коллекций, можно разделить на:
  1. те, которые решаются стандартными средствами (for, foreach + реализация коллекцией IEnumerable по умолчанию).
  2. те, которые не решаются через стандартные средства.

Ко второму типу задач, например, можно отнести следующую: обход бинарного дерева в обратном порядке. Дерево тоже можно представить как IEnumerable, а способ обхода дерева как IEnumerator. IEnumerator это реализация алгоритма, который можно повторно использовать и при этом не раскрывается внутреннее прелставление.

А тот же обход списка в обратном порядке, как отвечали выше, можно обойти при помощи for.

То есть, не надо на ровном месте писать кучу энумераторов — пишите их там где это Вам удобно.

А>И зачем это нужно для работы со списком или массивом? Понятие о "внутреннем представлении" этих объектов мне кажется надуманным, а разработка на каждый чих (например, обратный перебор или перебор с условием) нового итератора — излишней и не продуктивной. А если надо несколько переборов на много элементов с одинаковым условием делать, писать кэширующий итератор или просматривать весь список каждый раз?

А>Поверьте, я не ругаюсь, я просто не понимаю.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 11.09.06 15:30
Оценка:
Здравствуйте, vitz, Вы писали:

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


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

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

Что-то никак не пойму чего ты хотел своим сообщением сказать? Можешь расшифровать (для тех, кто в танке)?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как получить обратный for each?
От: Аноним  
Дата: 11.09.06 16:02
Оценка:
Zapolnyai Queue v processe prohoda foreach-em Potom vnutri etogo Queue eshe odin Queue (rekursivno) — poluchitsya mayatnik
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, Вы писали:

Лично в моей практике таких проблем не встречалось.
Re[7]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 06:37
Оценка:
Lloyd

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


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

N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.

Ага. Давайте найдем задачу для индекса, и попробуем ее запихнуть в энумератор. Круто придумано.


Примеры использования энумератора.
public class Helper
{
    //Для прохода через step
  public static IEnumerable<T> GetEnumeratorWithStep(IList list, int step)
    {
            for (int i=0;i<list.Count;i+=step)
                yield return list[i];
    }
    //Для прохода в обратном порядке.
    public static IEnumerable<T> Reverse(IList list)
    {
        for (int i=list.Count-1;i>=0;i--)
            yield return list[i];
    }
}


Ежели тебе это нужно один раз, можешь обойтись и прямым доступом. Если ты вызываешь 10 раз из разных мест и чтобы красиво, то делай энумератор. Только не надо говорить про производительность. На фоне GUI и работы с БД — это выглядит смешно.
Более красивый вариант применения итераторов в функциях высшего порядка. Типа:
public class Helper
{
    public static void ForEach(IEnumerable<T> enumer, Action<T> action)
    {
        foreach(T t in enumer)
          action(t)
    }
}
//использование для задачи с гридом
Helper.ForEach<DataGridViewRow>(Helper.GetEnumeratorWithStep<DataGridViewRow>(myGrid.Rows, 2), delegate(DataGridRow i){row.Color=Color.Green;});
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 12.09.06 07:24
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.


http://rsdn.ru/forum/Message.aspx?mid=2103098&amp;only=1
Автор: Lloyd
Дата: 11.09.06
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 12.09.06 07:29
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>А то что в других случаях лепить итераторы в своих сорцах просто бессмысленно.


Понимаешь, тут вопрос в общем-то не о том, что без итераторов жить нельзя. Конечно же без них обойтись можно. Просто с ними как-то удобнее и код опрятнее выглядит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Как получить обратный for each?
От: IB Австрия http://rsdn.ru
Дата: 12.09.06 07:46
Оценка: 1 (1) :))) :)))
Здравствуйте, Nimnul, Вы писали:

N>foreach не гибок,

Всяко гибче for-а

N> Поэтому когда я вижу в чьемто сорце итераторы меня сразу тошнит и я дальше без всяких объективных причин не могу смокойно смотреть на этот сорц, и в итоге я этот сорц посылаю фтопку %).

Приятно слышать, что в моих исходниках не будет ковыряться кто попало..
... << RSDN@Home 1.2.0 alpha rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[9]: Как получить обратный for each?
От: Аноним  
Дата: 12.09.06 08:59
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Примеры использования энумератора.

GZ>
GZ>public class Helper
GZ>{
GZ>    //Для прохода через step
GZ>  public static IEnumerable<T> GetEnumeratorWithStep(IList list, int step)
GZ>    {
GZ>            for (int i=0;i<list.Count;i+=step)
GZ>                yield return list[i];
GZ>    }
GZ>    //Для прохода в обратном порядке.
GZ>    public static IEnumerable<T> Reverse(IList list)
GZ>    {
GZ>        for (int i=list.Count-1;i>=0;i--)
GZ>            yield return list[i];
GZ>    }
GZ>}
GZ>


GZ>public class Helper

GZ>{
GZ> public static void ForEach(IEnumerable<T> enumer, Action<T> action)
GZ> {
GZ> foreach(T t in enumer)
GZ> action(t)
GZ> }
GZ>}
GZ>//использование для задачи с гридом
GZ>Helper.ForEach<DataGridViewRow>(Helper.GetEnumeratorWithStep<DataGridViewRow>(myGrid.Rows, 2), delegate(DataGridRow i){row.Color=Color.Green;});
GZ>[/c#]

Кошмар!
И внутри каждого всёравно тот же for...
Re[10]: Как получить обратный for each?
От: GlebZ Россия  
Дата: 12.09.06 09:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Кошмар!

А>И внутри каждого всёравно тот же for...
А ты не сравнивай for и итератор. Это две разные категории. for — statement. iterator — паттерн который унифицирует и скрывает доступ. Эти вещи несравнимы так как обозначают два разных логических термина и служат для разных вещей.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Как получить обратный for each?
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 12.09.06 14:49
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.


Очень просто. Львиная доля операций со списками (если не все) делается через filter/map/reduce. В C# нет ленивых списков и ФП вообще. Поэтому эмулируем это дело при помощи yield return и foreach.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Как получить обратный for each?
От: TK Лес кывт.рф
Дата: 12.09.06 15:41
Оценка:
Hello, "Nimnul"

> Lloyd

>
> Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1,
> каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.
>

Можно обобщить. Есть поток информации которую надо расскидать в разные
места. Хотелось бы посмотреть решение данной задачи в контексте for
всех рвет...
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить обратный for each?
От: Andrbig  
Дата: 13.09.06 06:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


N>>угу поддерживаю for рулит


L>Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.


Сказав А, не затруднит сказать Б — список этих 99% ?
Re[5]: Как получить обратный for each?
От: Andrbig  
Дата: 13.09.06 06:54
Оценка:
Здравствуйте, Nimnul, Вы писали:

N>foreach не гибок, само то что для различных перечислений требуются различные итераторы уже ставит крест на этом. Я уже не говорю о много поточности, достук к одному итератору в разных потоках сделает бобо. Другое дело индексатор, поддерживает любые фантазии с перечислениями, потоко безопасен и т.д. Поэтому когда я вижу в чьемто сорце итераторы меня сразу тошнит и я дальше без всяких объективных причин не могу смокойно смотреть на этот сорц, и в итоге я этот сорц посылаю фтопку %). Я понимаю, что можно юзать foreach там где без ниго никак, скажем в МС сделали мега класс у которого есть только итератор, но зачем бяку делать в своих сорцах?


Можно пример про многопоточность, напрмиер про "достук к одному итератору в разных потоках сделает бобо"?
Re[4]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 08:16
Оценка: -2 :)
Здравствуйте, Andrbig, Вы писали:

L>>Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.


A>Сказав А, не затруднит сказать Б — список этих 99% ?


Затруднит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 08:36
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>А ты не сравнивай for и итератор. Это две разные категории. for — statement. iterator — паттерн который унифицирует и скрывает доступ. Эти вещи несравнимы так как обозначают два разных логических термина и служат для разных вещей.

А я по наивности своей считал, что они оба служат для перебора элементов коллекции или массива, с целью что-то с этими элементами делать в определённом порядке
Re: Как получить обратный for each?
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.09.06 10:56
Оценка: 4 (1)
Здравствуйте, Alexander_fx, Вы писали:

A_>for each dd as mycls in mycollection

A_>next dd

A_>Как полуить обратную последовательность?

public static IEnumerable<T> Reverse<T>(IEnumerable<T> source)
{
    IList<T> temp;
    if (source is IList<T>)
        temp = (IList<T>)source;
    else
        temp = new List<T>(source);
    foreach(int i=temp.Count-1; i>=0; i--)
        yield return temp[i];
}
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Как получить обратный for each?
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.09.06 10:56
Оценка: 1 (1) +4 :)
Здравствуйте, Nimnul, Вы писали:

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

Нимнул, за время, которое прошло с момента твоего первого постинга на тему итераторов вс. индексаторы уж можно было научиться новому. Следим за руками:

public static class CollectionHelper 
{
  public static IEnumerable<T> SkipEvens(IEnumerable<T> source, bool skipFirst)
    {
      bool skip=skipFirst;
      foreach(T item in source)
        {
          if (!skip)
              yield return item;
            skip= !skip;
        }
    }
}

И крась себе каждый второй без проблем:

foreach(GridRow row in CollectionHelper.SkipEvens(myGrid.Rows, false)
  row.Color = Color.Green


И что можно сказать о разработчике, который неспособен написать вот такой код без наличия индексатора?
Разработчики грида, возможно, имели веские причины отказаться от реализации this[]. Например, строки внутри хранятся как связный список. Они конечно могли бы реализовать индексер, который бы работал за O(index). И наш гениальный нимнул написал бы код, который бы требовал квадратичного времени для раскраски нечетных строк. Как там насчет топки, а?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Как получить обратный for each?
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.09.06 10:56
Оценка: +1
Здравствуйте, Nimnul, Вы писали:
N>
данное сообщение получено с www.gotdotnet.ru

N>ссылка на оригинальное сообщение

Нимнул, правильный вариант — вот такой:
public static class CollectionHelper
{
  public static IEnumerable<T> Filter<T>(IEnumerable<T> source, Predicate<T> predicate)
    {
      foreach(T item in source)
          if (Predicate(item))
              yield return item;
    }
}

Вот так мы получаем список строк, которые нужно покрасить:
int currentRow=1;
IEnumerable<GridRow> greenRows = CollectionHelper.Filter(myGrid.Rows, delegate{return (currentRow++ / 4) % 2 == 0; });
foreach(GridRow makeGreen in greenRows)
{
  makeGreen.Color = Color.Green;
}

Все. Если понадобиться красить каждую пятую строку, то придется всего лишь немного поменять текст делегата. Заметь, что это работает за O(N) независимо от внутреннего представления списка строк. Итераторы рулят. Учи итераторы, пока не поздно.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Как получить обратный for each?
От: Andrbig  
Дата: 13.09.06 11:01
Оценка: -1 :)
Здравствуйте, Lloyd, Вы писали:

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


L>>>Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.


A>>Сказав А, не затруднит сказать Б — список этих 99% ?


L>Затруднит.


Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.
Re[6]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 11:29
Оценка: +1 -1 :))
Здравствуйте, Andrbig, Вы писали:

A>>>Сказав А, не затруднит сказать Б — список этих 99% ?


L>>Затруднит.


A>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.


Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 11:32
Оценка: 2 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>
S>public static IEnumerable<T> Reverse<T>(IEnumerable<T> source)
S>{
S>    IList<T> temp;
S>    if (source is IList<T>)
S>        temp = (IList<T>)source;
S>    else
S>        temp = new List<T>(source);
S>    for(int i=temp.Count-1; i>=0; i--)
S>        yield return temp[i];
S>}
S>


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 11:49
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

S>Все. Если понадобиться красить каждую пятую строку, то придется всего лишь немного поменять текст делегата. Заметь, что это работает за O(N) независимо от внутреннего представления списка строк. Итераторы рулят. Учи итераторы, пока не поздно.


Ну а как же for(int i = 0; i < stringsCount; i+=M) { paintString(i); } ?
Поменять если что надо всего одну цифру, нет никаких делегатов, лишних итераций... кто тут рулит то, я не разобрал?
Re[12]: Как получить обратный for each?
От: GlebZ Россия  
Дата: 13.09.06 12:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


GZ>>А ты не сравнивай for и итератор. Это две разные категории. for — statement. iterator — паттерн который унифицирует и скрывает доступ. Эти вещи несравнимы так как обозначают два разных логических термина и служат для разных вещей.

А>А я по наивности своей считал, что они оба служат для перебора элементов коллекции или массива, с целью что-то с этими элементами делать в определённом порядке
Ну попробуй написать for для коллекции.
for — это операция цикла с счетчиком. Почти синтаксический сахар для while. А используется ли она для индексируемого доступа к массиву, или не используется — это уже второй вопрос. В случае iterator — это есть перебор значений коллекции (не обязательно массива) по некоторому алгоритму. При этом алгоритм может быть любым, как простым, так и очень сложным.
Кроме того, для большинства случаев, а это записи типа
for(int i=0;i<arr.Length;i++)
  val+=arr[i];

Здесь переменная i — есть суррогат который не несет никакой смысловой нагрузки. Пока ее не используют за пределами массива, или доступ не ограничен регионом, она бессмысленный мусор. В данном случае и сам цикл есть суррогат. Более наглядно что-то здесь будет что-то типа
Array.ForEach<T>(a => val+=a);

Но такое возможно только в C# 3.0. Пока что можно довольствоваться:
Array.ForEach<T>(delegate(int a){val+=a;});

Что несколько более многословно, но все таки более читабельно чем индексированный доступ через for. И заметь, в отличие от for такое работает для всех типов коллекций независимо от типа доступа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 12:34
Оценка:
Здравствуйте, GlebZ, Вы писали:

Сорри, вместо "коллеций и массивов" мне следовало написать "последовательностей", так более правильно.

GZ>Что несколько более многословно, но все таки более читабельно чем индексированный доступ через for. И заметь, в отличие от for такое работает для всех типов коллекций независимо от типа доступа.


Насчёт читабельности можно спорить бесконечно — это дело вкуса. Пока что я вижу за всеми недостатками foreach только одно преимущество — грубо говоря если я вдруг где либо решу поменять массив на связный список, мне не придётся менять код обращения во всех местах, где оно производится. Но я что-то за 7 лет практики (не смейтесь пожалуйста, о великие гуру) такого не припомню. Да и в любом случае это скорее всего ограничится методами одного класса. И использовать эти громоздкие конструкции без дела как то неохота.
Re[14]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 12:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Насчёт читабельности можно спорить бесконечно — это дело вкуса. Пока что я вижу за всеми недостатками foreach только одно преимущество — грубо говоря если я вдруг где либо решу поменять массив на связный список, мне не придётся менять код обращения во всех местах, где оно производится. Но я что-то за 7 лет практики (не смейтесь пожалуйста, о великие гуру) такого не припомню. Да и в любом случае это скорее всего ограничится методами одного класса. И использовать эти громоздкие конструкции без дела как то неохота.


Вообще-то громоздкость for-а в разы выше громоздкости foreach-а.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Как получить обратный for each?
От: _FRED_ Черногория
Дата: 13.09.06 12:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Нимнул, за время, которое прошло с момента твоего первого постинга на тему итераторов вс. индексаторы уж можно было научиться новому. Следим за руками:




Причём, в Sequence (из Linq) это уже практически сделано:

  public delegate R Function<A1, A2, R>(A1 arg1, A2 arg2);

  public static partial class Sequence
  {
    public static IEnumerable<T> Where<T>(IEnumerable<T> source, Function<T, int, bool> predicate) {
      if(source == null) {
        throw new ArgumentNullException("source");
      } else if(predicate == null) {
        throw new ArgumentNullException("predicate");
      }//if

      int index = 0;
      foreach(T element in source) {
        if(predicate(element, index)) {
          yield return element;
        }//if
        index++;
      }//for
    }
  }


Это всё часть фреймворка и класс отпосится к пространству имён System.
Тогда:
S>foreach(GridRow row in Sequence.Where(myGrid.Rows, delegate(int index, GridRow item) { return index % 2 != 0; })
S>  row.Color = Color.Green


То есть всё, что требуется от рядового программера — это написать условие Where и суметь задание "каждый второй" реализовать через оператор '%'.
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[15]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 13:28
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Вообще-то громоздкость for-а в разы выше громоздкости foreach-а.

Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...
Re[16]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 13:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...


А зачем выбирать что-то одно? Будьте гибче.
Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 14:09
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

L>А зачем выбирать что-то одно? Будьте гибче.

L>Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.

Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...
Re[18]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 13.09.06 14:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:

L>>А зачем выбирать что-то одно? Будьте гибче.

L>>Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.

А>Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...


Если мне не изменяет мой склероз, компилятор если видит, что идет foreach-енье массива, разворачивает его в простой for, так что, на мой взгляд, ты ничего, кроме худшей четабельности, не теряешь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[18]: Как получить обратный for each?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.09.06 14:23
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...


А foreach для перебора массива итератор и не использует.

Что же касается применимости, то в документации к Java 5 есть очень полезный совет — foreach нужно применять везде, где это возможно, потому что это значительно повышает читаемость кода.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[7]: Как получить обратный for each?
От: Аноним  
Дата: 13.09.06 14:23
Оценка:
_FR>
S>>foreach(GridRow row in Sequence.Where(myGrid.Rows, delegate(int index, GridRow item) { return index % 2 != 0; })
S>>  row.Color = Color.Green
_FR>


Лучше так:
foreach (GridRow row in myGrid.Rows.Where(i => i % 2 != 0))
  row.Color = Color.Green;
Re[8]: Как получить обратный for each?
От: _FRED_ Черногория
Дата: 13.09.06 14:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

S>>>foreach(GridRow row in Sequence.Where(myGrid.Rows, delegate(int index, GridRow item) { return index % 2 != 0; })
S>>>  row.Color = Color.Green


А>Лучше так:

А>foreach (GridRow row in myGrid.Rows.Where(i => i % 2 != 0))
А>  row.Color = Color.Green;


Это будет доступно уже при новом компиляторе C#. Мой же вариант работает под уже сужествующим C# 2.0.
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[9]: Как получить обратный for each?
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.09.06 03:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>Ну а как же for(int i = 0; i < stringsCount; i+=M) { paintString(i); } ?
А>Поменять если что надо всего одну цифру, нет никаких делегатов, лишних итераций...
Если коллекция не позволяет индексацию, то ее эмуляция поверх итератора будет приводить в этом случае к квадратичным затратам времени.
Поменять, "если что", надо будет столько же.
А> кто тут рулит то, я не разобрал?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Как получить обратный for each?
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.09.06 01:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


L>>Вообще-то громоздкость for-а в разы выше громоздкости foreach-а.

А>Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...
Еще раз. Там нет никакой кучи кода. "Куча", которая очевидна и прозрачна, пишется 1 раз за всю жизнь проекта. А потом по мере необходимости используется одна строчка. И это гораздо надежнее и проще в отладке, чем твои две строчки. Особенно если такие пары строчек разбросаны по всему проекту.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: Как получить обратный for each?
От: Poul_Ko Казахстан  
Дата: 15.09.06 02:50
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Если мне не изменяет мой склероз, компилятор если видит, что идет foreach-енье массива, разворачивает его в простой for, так что, на мой взгляд, ты ничего, кроме худшей четабельности, не теряешь.


Склероз тебе не изменяет Специально проверял ILDasm'ом — для массива foreach разворачивается в обычный for с использованием доступа по индексу.

Возникает резонный вопрос, как для своего класса сделать так же? Даст ли такой же эффект использование
public IEnumerator GetEnumerator()
{
  for (i=0; i<this.Count; i++)
    yield return this[i];
}

К сожалению времени проверить нету...
Brainbench transcript #6370594
Re[20]: Как получить обратный for each?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.09.06 08:26
Оценка:
Здравствуйте, Poul_Ko, Вы писали:

P_K>Возникает резонный вопрос, как для своего класса сделать так же?


Никак. Это захардкожено в компиляторе.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[20]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 15.09.06 08:37
Оценка:
Здравствуйте, Poul_Ko, Вы писали:

P_K>Возникает резонный вопрос, как для своего класса сделать так же?


Ну если только нписать свой компилятор C#
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: Как получить обратный for each?
От: Аноним  
Дата: 17.09.06 08:48
Оценка:
Sinclair да и вобще всю программу можно писать в одну строчку без б.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[16]: Как получить обратный for each?
От: Аноним  
Дата: 17.09.06 08:52
Оценка: -3
по данному топику хотелось бы еще раз подытожить что for рулит по следующим позициям:
1. наглядногость и читабельность
2. производительность
3. гибкость

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


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

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


A>>>>Сказав А, не затруднит сказать Б — список этих 99% ?


L>>>Затруднит.


A>>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.


L>Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.


А если все же привести пример когда "99%-ах случаев он вовсе не рулит"? Или предметный разговор без брехни — не твой выбор?
Re[8]: Как получить обратный for each?
От: Lloyd Россия  
Дата: 25.09.06 08:38
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>>>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.


L>>Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.


A>А если все же привести пример когда "99%-ах случаев он вовсе не рулит"?


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

A>Или предметный разговор без брехни — не твой выбор?


Брешут обычно собаки, так что это скорее к тебе относится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Как получить обратный for each?
От: Andrbig  
Дата: 25.09.06 10:06
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


A>>>>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.


L>>>Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.


A>>А если все же привести пример когда "99%-ах случаев он вовсе не рулит"?


L>Твой вопрос бессмысленен. Скачай какую-нить библиотеку, например хивернейт и погрепь. Получишь статистику, которой ты так жажьдешь.


Твой ответ бессмысленен. Или под рулит-не рулит ты понимаешь любит-не любит, а не конкретные плюсы и минусы? Что ж, профессионализм налицо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.