Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, 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 лет практики (не смейтесь пожалуйста, о великие гуру) такого не припомню. Да и в любом случае это скорее всего ограничится методами одного класса. И использовать эти громоздкие конструкции без дела как то неохота.
Здравствуйте, <Аноним>, Вы писали:
А>Насчёт читабельности можно спорить бесконечно — это дело вкуса. Пока что я вижу за всеми недостатками foreach только одно преимущество — грубо говоря если я вдруг где либо решу поменять массив на связный список, мне не придётся менять код обращения во всех местах, где оно производится. Но я что-то за 7 лет практики (не смейтесь пожалуйста, о великие гуру) такого не припомню. Да и в любом случае это скорее всего ограничится методами одного класса. И использовать эти громоздкие конструкции без дела как то неохота.
Вообще-то громоздкость for-а в разы выше громоздкости foreach-а.
Здравствуйте, 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");
}//ifint 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-а.
Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...
Здравствуйте, <Аноним>, Вы писали:
А>Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...
А зачем выбирать что-то одно? Будьте гибче.
Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.
Здравствуйте, Lloyd, Вы писали:
L>А зачем выбирать что-то одно? Будьте гибче. L>Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.
Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...
Здравствуйте, <Аноним>, Вы писали:
L>>А зачем выбирать что-то одно? Будьте гибче. L>>Там где важна позиция элемента в коллекции — используйте for, если необходимости в этом нет, то не загромождайте код лишними строчками/переменными и используйте foreach.
А>Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...
Если мне не изменяет мой склероз, компилятор если видит, что идет foreach-енье массива, разворачивает его в простой for, так что, на мой взгляд, ты ничего, кроме худшей четабельности, не теряешь.
Здравствуйте, <Аноним>, Вы писали:
А>Я обычно делаю так: везде где можно без изврата пишу for, а в остальных местах foreach.. но вот тут была такая фраза на вроде "учите итераторы пока не поздно", а на мой взгляд итератор для перебора массива это как паровой молот для сапожного гвоздя...
А foreach для перебора массива итератор и не использует.
Что же касается применимости, то в документации к Java 5 есть очень полезный совет — foreach нужно применять везде, где это возможно, потому что это значительно повышает читаемость кода.
Здравствуйте, <Аноним>, Вы писали: А>Ну а как же for(int i = 0; i < stringsCount; i+=M) { paintString(i); } ? А>Поменять если что надо всего одну цифру, нет никаких делегатов, лишних итераций...
Если коллекция не позволяет индексацию, то ее эмуляция поверх итератора будет приводить в этом случае к квадратичным затратам времени.
Поменять, "если что", надо будет столько же. А> кто тут рулит то, я не разобрал?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Lloyd, Вы писали:
L>>Вообще-то громоздкость for-а в разы выше громоздкости foreach-а. А>Посмотри на пример ниже (с покраской в разные цвета каждой энной строчки). Ужас какую кучу кода надо нагородить для этого чтобы через итераторы вместо простых предложенных мной двух строчек...
Еще раз. Там нет никакой кучи кода. "Куча", которая очевидна и прозрачна, пишется 1 раз за всю жизнь проекта. А потом по мере необходимости используется одна строчка. И это гораздо надежнее и проще в отладке, чем твои две строчки. Особенно если такие пары строчек разбросаны по всему проекту.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Lloyd, Вы писали:
L>Если мне не изменяет мой склероз, компилятор если видит, что идет foreach-енье массива, разворачивает его в простой for, так что, на мой взгляд, ты ничего, кроме худшей четабельности, не теряешь.
Склероз тебе не изменяет Специально проверял ILDasm'ом — для массива foreach разворачивается в обычный for с использованием доступа по индексу.
Возникает резонный вопрос, как для своего класса сделать так же? Даст ли такой же эффект использование
public IEnumerator GetEnumerator()
{
for (i=0; i<this.Count; i++)
yield return this[i];
}
по данному топику хотелось бы еще раз подытожить что for рулит по следующим позициям:
1. наглядногость и читабельность
2. производительность
3. гибкость
пожалуй большего и ненадо чтобы больше никогда не вспоминать foreach. А тем кому нужен явовский синтаксис пусть сидят на яве.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Andrbig, Вы писали:
A>>>>Сказав А, не затруднит сказать Б — список этих 99% ?
L>>>Затруднит.
A>>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.
L>Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.
А если все же привести пример когда "99%-ах случаев он вовсе не рулит"? Или предметный разговор без брехни — не твой выбор?
Здравствуйте, Andrbig, Вы писали:
A>>>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.
L>>Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.
A>А если все же привести пример когда "99%-ах случаев он вовсе не рулит"?
Твой вопрос бессмысленен. Скачай какую-нить библиотеку, например хивернейт и погрепь. Получишь статистику, которой ты так жажьдешь.
A>Или предметный разговор без брехни — не твой выбор?
Брешут обычно собаки, так что это скорее к тебе относится.