powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Базовый вопрос про делилат в foreach
17 сообщений из 17, страница 1 из 1
Базовый вопрос про делилат в foreach
    #38747973
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу разобраться с элементарным.

Foreach за место for юзаю и понимаю.

Но вот со следующей конструкцией пока не получается.

Допустим есть коллекция интеджеров
Код: c#
1.
2.
3.
4.
    List<int> a = new List<int>();
            a.Add(123);
            a.Add(434);
            a.Add(1231);



Хочу возвести ее в квадрат с помощью следующей КОНСТРУКции:

Код: c#
1.
2.
3.
           Action<int> myaction = new Action<int>(XXX);

            a.ForEach(myaction);



XXXX = В ЭТОМ МЕСТЕ ПРОБЛЕМА. НЕ ПОЛУЧАЕТСЯ ВПИХНУТЬ НАЗВАНИЕ ФУНКЦИИ КОТОРАЯ ВОЗВЕДЕТ ВСЕ В КВАДРАТ, а точнее как именно она должна выглядеть

Заранее благодарю за тупой вопрос от новичка
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38747985
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обязательно делать через Action? в данном случае, можно обойтись просто LINQ-выборкой
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38747988
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
a.Select(n = > n * n)
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38747990
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belobrodsky,

Код: c#
1.
2.
3.
4.
5.
6.
7.
            Func<int, long> square = x => x * x;
            List<int> lst = new List<int>(new[] {1,2,3,4,5,6,7,8,9});

            lst
                .Select(square)
                .ToList()
                .ForEach(Console.WriteLine);
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38747993
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто в учебных целях для себя )) сделать можно и по рабоче крестьянски
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38747994
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Код: c#
1.
a.Select(n = > n * n)

упс, случайно лишний пробел
Код: c#
1.
a.Select(n => n * n)
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38748018
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belobrodsky, метод ForEach не подходит для операций измененящих коллекцию. Об этом сказано в MSDN:
http://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx Modifying the underlying collection in the body of the Action<T> delegate is not supported and causes undefined behavior.
Используй обычный цикл for.

Держа вышесказанное в уме при желании все-таки можно заставить ForEach выполнить эту работу:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
List<int> a = new List<int>();
a.Add(123);
a.Add(434);
a.Add(1231);

// Это плохой код. Не надо так делать.
int i=0;
a.ForEach(n => { a[i++] = n*n; } );


Это плохой код потому что полпгается на замыкания и потому что он хуже чем старый добрый цикл for.
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38748061
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750371
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вопрос, чисто ради красоты кода.

При использовании foreach для перебора элементов коллекции(массива) и желании иметь порядковый номер элемента в коллекции, есть ли какое-нибудь встроенный метод или свойство. возвращающее порядковый номер текущего элемента в коллекции или надо самостоятельно включать счетчик и делать ++ на каждой итерации, то есть как оптимизировать код

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
            List<int> col = new List<int>() { 12,241,14,1234,123,123,};

            int index = 0;
            foreach (int item in col)
            {
                Console.WriteLine("Элемент №" + index + " = " + item );
                index++;
            }



чтобы убрать index? реально ли?
П.С. Чисто с эстетической целью интересуюсь
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750376
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belobrodsky,

в MSDN забанили? http://msdn.microsoft.com/ru-ru/library/8bd0tetb(v=vs.110).aspx

Но в данном случае логично просто использовать цикл for.
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750377
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelobrodskyПри использовании foreach для перебора элементов коллекции(массива) и желании иметь порядковый номер элемента в коллекции используют for и не парят себе и другим мозги
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750380
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belobrodsky,

в вашем примере вообще без внешнего индекса никак BTW. потому что для 123 indexof будет работать некорректно.
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750390
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. IndexOf сам убедился что не подходит. Arm79, мой пример, чтобы до нести суть вопроса, а не для решения реальной задачи
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750413
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelobrodskyСпасибо. IndexOf сам убедился что не подходит. Arm79, мой пример, чтобы до нести суть вопроса, а не для решения реальной задачи

Еще раз, ваш пример - типичное никому не нужное извращение. Вы походу вообще не врубились в особенности циклов.

Итак, ни один из циклов не дает никакой информации по "порядковому номеру" элемента в коллекции. for - это красивая обертка над while (этим отличается от цикла for в Delphi, если вы его изучали).Из этого следует, что вы можете в теле цикла как угодно извращаться с переменной цикла. Например, три раза увеличите на 1, и один раз уменьшите на 2. В любом случае, пока условие истинно, цикл будет исполняться.

Таким образом я хочу подчеркнуть, что информация о порядковом номере элемента в коллекции хранится в самой коллекции. Переменная цикла в этом случае выступает как текущий ВНЕШНИЙ индекс.

Что касается foreach - это альтернативный доступ, предоставляемый коллекцией к своим элементам. Он изначально не заточен ни на какие порядковые номера. Например, деревья, или Dictionary, или HashSet. В общем, любой объект, который поддерживает итератор. Даже больше - такой объект может вообще не иметь никаких элементов, а динамически генерировать значения по своему усмотрению.

Подвожу итоги:
1) ни один цикл отношения к порядковому номеру элемента где-нибудь не имеет.
2) это где-нибудь, а точнее что-нибудь, может поддерживать, а может и не поддерживать доступ по порядковому номеру либо по имени, аналогично и с итераторами.
3) Определение порядкового номера элемента - это забота того объекта, который и хранит элементы. Обычно за это отвечает элемент IndexOf.
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750423
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelobrodskyСпасибо. IndexOf сам убедился что не подходит
IndexOf прекрасно подходит для вашего примера, просто вы не прочитали Help. Иначе бы знали, что этот метод возвращает ПЕРВОЕ вхождение элемента в коллекции. То есть он ведет себя совершенно корректно.

И у него есть перегрузки , которые позволяют после нахождения первого элемента искать и последующие, просто нужно немного приложить усилий. Организовать цикл пока метод не вернет -1, и всего то делов.
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750450
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belobrodsky,
природа foreach базируется на перечислениях, у них есть начало и может не быть конца
в один прекрасный момент вы отстрелите себе ногу этим пробелом .
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 static void Main(string[] args)
        {
            var i = int.MaxValue;
            foreach (var s in dd()) 
            {
                Console.WriteLine(++i);
            }
        }

        static IEnumerable<int> dd()
        {
            while (true)
            {
                yield return 1;
            }
        }
...
Рейтинг: 0 / 0
Базовый вопрос про делилат в foreach
    #38750610
Belobrodsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за удиленное время. В чем хотел убедиться - я убедился.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Базовый вопрос про делилат в foreach
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]