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); } ?
Поменять если что надо всего одну цифру, нет никаких делегатов, лишних итераций... кто тут рулит то, я не разобрал?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.