Здравствуйте, Nimnul, Вы писали:
N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.
Ага. Давайте найдем задачу для индекса, и попробуем ее запихнуть в энумератор. Круто придумано.
Примеры использования энумератора.
public class Helper
{
//Для прохода через steppublic 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;});
Здравствуйте, Nimnul, Вы писали:
N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.
Здравствуйте, Nimnul, Вы писали:
N>А то что в других случаях лепить итераторы в своих сорцах просто бессмысленно.
Понимаешь, тут вопрос в общем-то не о том, что без итераторов жить нельзя. Конечно же без них обойтись можно. Просто с ними как-то удобнее и код опрятнее выглядит.
Здравствуйте, 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...
А ты не сравнивай for и итератор. Это две разные категории. for — statement. iterator — паттерн который унифицирует и скрывает доступ. Эти вещи несравнимы так как обозначают два разных логических термина и служат для разных вещей.
Здравствуйте, Nimnul, Вы писали:
N>Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, каждую третью запись в ArrayList2, каждую четвертую в ArrayList4.
Очень просто. Львиная доля операций со списками (если не все) делается через filter/map/reduce. В C# нет ленивых списков и ФП вообще. Поэтому эмулируем это дело при помощи yield return и foreach.
Hello, "Nimnul"
> Lloyd > > Хорошо допустим тебе нужно каждую вторую запись добавить в ArrayList1, > каждую третью запись в ArrayList2, каждую четвертую в ArrayList4. >
Можно обобщить. Есть поток информации которую надо расскидать в разные
места. Хотелось бы посмотреть решение данной задачи в контексте for
всех рвет...
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Nimnul, Вы писали:
N>>угу поддерживаю for рулит
L>Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.
Сказав А, не затруднит сказать Б — список этих 99% ?
Здравствуйте, Nimnul, Вы писали:
N>foreach не гибок, само то что для различных перечислений требуются различные итераторы уже ставит крест на этом. Я уже не говорю о много поточности, достук к одному итератору в разных потоках сделает бобо. Другое дело индексатор, поддерживает любые фантазии с перечислениями, потоко безопасен и т.д. Поэтому когда я вижу в чьемто сорце итераторы меня сразу тошнит и я дальше без всяких объективных причин не могу смокойно смотреть на этот сорц, и в итоге я этот сорц посылаю фтопку %). Я понимаю, что можно юзать foreach там где без ниго никак, скажем в МС сделали мега класс у которого есть только итератор, но зачем бяку делать в своих сорцах?
Можно пример про многопоточность, напрмиер про "достук к одному итератору в разных потоках сделает бобо"?
Здравствуйте, 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 — паттерн который унифицирует и скрывает доступ. Эти вещи несравнимы так как обозначают два разных логических термина и служат для разных вещей.
А я по наивности своей считал, что они оба служат для перебора элементов коллекции или массива, с целью что-то с этими элементами делать в определённом порядке
Здравствуйте, 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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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;
}
}
Вот так мы получаем список строк, которые нужно покрасить:
Все. Если понадобиться красить каждую пятую строку, то придется всего лишь немного поменять текст делегата. Заметь, что это работает за O(N) независимо от внутреннего представления списка строк. Итераторы рулят. Учи итераторы, пока не поздно.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Andrbig, Вы писали:
L>>>Ну все-таки в 99%-ах случаев он вовсе не рулит. А для оставшегося 1% можно и for использовать.
A>>Сказав А, не затруднит сказать Б — список этих 99% ?
L>Затруднит.
Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.
Здравствуйте, Andrbig, Вы писали:
A>>>Сказав А, не затруднит сказать Б — список этих 99% ?
L>>Затруднит.
A>Ясно. Значит имеем дело с бредом сивой кобылы в лунную ночь.
Да, читая твои посты я это заметил. Но врожденная вежливость не давала мне обратить твое внимание на это. Спасибо, что помог.
Здравствуйте, Sinclair, Вы писали:
S>Все. Если понадобиться красить каждую пятую строку, то придется всего лишь немного поменять текст делегата. Заметь, что это работает за O(N) независимо от внутреннего представления списка строк. Итераторы рулят. Учи итераторы, пока не поздно.
Ну а как же for(int i = 0; i < stringsCount; i+=M) { paintString(i); } ?
Поменять если что надо всего одну цифру, нет никаких делегатов, лишних итераций... кто тут рулит то, я не разобрал?