Замена Enumerable.Range.Select
От: Cynic Россия  
Дата: 21.03.15 14:10
Оценка:
Подскажите есть ли замена для Enumerable.Range.Select но без возвращаемого значения?
Например, чтобы можно было сделать что-то типа этого:
    Enumerable.Range(x, y).Select(x => {});

Можно конечно так, но криво как-то выглядит:
    Enumerable.Range(x, y).Select(x => 
    {
        // что-то делаем
        return x; 
    });

Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.
:)
Отредактировано 21.03.2015 14:13 Cynic . Предыдущая версия .
Re: Замена Enumerable.Range.Select
От: QrystaL Украина  
Дата: 21.03.15 14:33
Оценка: 1 (1)
Здравствуйте, Cynic, Вы писали:
C>Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.

https://github.com/Reactive-Extensions/Rx.NET/blob/master/Ix.NET/Source/System.Interactive/EnumerableEx.Single.cs#L38
Re: Замена Enumerable.Range.Select
От: Sinix  
Дата: 21.03.15 15:14
Оценка: +2
Здравствуйте, Cynic, Вы писали:


C>Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.

Плохая идея. Совсем плохая.
Re[2]: Замена Enumerable.Range.Select
От: Cynic Россия  
Дата: 21.03.15 15:54
Оценка: 1 (1)
Здравствуйте, Sinix, Вы писали:

S>Плохая идея. Совсем плохая.


Ну кстати я заметил, что Foreach намного быстрее Enumerable.Range для маленьких массивов, и намного медленнее для больших. Причём если выполняться тесты для Enumerable.Range несколько раз подряд (в цикле), то уже первый раз перебор занимает например 6000 тиков, а второй и последующие уже например 10. С чем это связано?
:)
Re[3]: Замена Enumerable.Range.Select
От: Sinix  
Дата: 21.03.15 16:24
Оценка: +2
Здравствуйте, Cynic, Вы писали:

S>>Плохая идея. Совсем плохая.


C>Ну кстати я заметил, что Foreach намного быстрее Enumerable.Range для маленьких массивов, и намного медленнее для больших.

Что-то вы не то меряете. Особенно если оценки в тиках (и это не усреднённое время на паре миллионов итераций) — слишком легко померять jit/gc вместо вашего кода.

Самое прикольное, что идея плоха не из-за производительности. Проблема в злоупотреблении фишками языка.
Re[4]: Замена Enumerable.Range.Select
От: Cynic Россия  
Дата: 21.03.15 16:44
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>Что-то вы не то меряете. Особенно если оценки в тиках (и это не усреднённое время на паре миллионов итераций) — слишком легко померять jit/gc вместо вашего кода.


Ну мерил так:
    class Program
    {
        static void Main(string[] args)
        {
            int[] size = { 10, 100, 1000, 10000, 100000, 1000000};      // Размеры массивов для которых будут выполняться тесты
            const int iterationCount = 100;                             // Количество замеров для каждого из размеров массива

            Console.WriteLine("Iteration count: {0}\n", iterationCount);

            while (true)
            {
                for (int n = 0; n < size.Length; n++)
                {
                    int[] array = new int[size[n]];
                    List<int> list = new List<int>(new int[size[n]]);
                    Console.WriteLine("Elements count: {0}", size[n]);

                    // ---=== Тесты ===---
                    ForeachInt(array, iterationCount);
                    EnumerableRangeInt(array, iterationCount);

                    Console.WriteLine();
                }

                Console.WriteLine("---=== Press any key to repeat test ===---\n");
                Console.ReadKey();
            }    
        }

        // foreach - int[]
        static void ForeachInt(int[] array, int iterationCount)
        {
            double overallTicks = 0;
            for (int n = 0; n < iterationCount; n++)
            {
                int incrementor = 0;
                var sw = Stopwatch.StartNew();

                foreach (int value in array)
                {
                    incrementor++;
                }

                sw.Stop();
                overallTicks += sw.ElapsedTicks;
            }
            Console.WriteLine("foreach - int[] : {0}", overallTicks / iterationCount);
        }

        // Enumerable.Range - int[]
        static void EnumerableRangeInt(int[] array, int iterationCount)
        {
            double overallTicks = 0;
            for (int n = 0; n < iterationCount; n++)
            {
                int incrementor = 0;
                var sw = Stopwatch.StartNew();

                Enumerable.Range(0, array.Length).Select(x => incrementor++);

                sw.Stop();
                overallTicks += sw.ElapsedTicks;
            }
            Console.WriteLine("Enumerable - int[] : {0}", overallTicks / iterationCount);
        }
    }

Хотел померить кто быстрее в переборе, т.е. доступ к элементам массива не мерил.
:)
Re[5]: Замена Enumerable.Range.Select
От: TK Лес кывт.рф
Дата: 21.03.15 18:14
Оценка: +2
Здравствуйте, Cynic, Вы писали:

C>Enumerable.Range(0, array.Length).Select(x => incrementor++);

C>Хотел померить кто быстрее в переборе, т.е. доступ к элементам массива не мерил.

А где перебор то? Перебор это Enumerable.Range(0, array.Length).Select(x => incrementor++).Last();
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: Замена Enumerable.Range.Select
От: Cynic Россия  
Дата: 21.03.15 19:51
Оценка:
Здравствуйте, TK, Вы писали:

TK>А где перебор то? Перебор это Enumerable.Range(0, array.Length).Select(x => incrementor++).Last();


Согласен, мой косяк.
:)
Re: Замена Enumerable.Range.Select
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.03.15 00:37
Оценка: +7 :))) :))) :))
Здравствуйте, Cynic, Вы писали:

C>Подскажите есть ли замена для Enumerable.Range.Select но без возвращаемого значения?

C>...Мне нужно просто перебрать диапазон и для каждого элемента, что-то сделать не возвращая значения. foreach и for чего то поднадоели.

Попробуй бар. Ну, где женщины водятся и выпить чего есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.