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>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.