Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
1

Enumerators

20.05.2010, 20:11. Просмотров 1612. Ответов 18
Метки нет (Все метки)

Здравствуйте. У меня есть список. Я пробегаю по нему форичем, но могу сделать это только один раз. Подскажите плиз, как сбросить енумератор у списка? Если можно, то желательно и код тоже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2010, 20:11
Ответы с готовыми решениями:

Enumerators and calculus
Hi everyone. I want ask you. Can you help me to add some additional functions into my project....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
kirill29
2066 / 1229 / 169
Регистрация: 01.02.2009
Сообщений: 2,842
20.05.2010, 20:13 2
Howaito Enjeru, код покажи.
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
20.05.2010, 20:24 3
вообще говоря, у интерфейса IEnumerator есть метод Reset()

резервировать IEnumerator вручную не советую

если список самопальный, убедись, что в конструкторе энумератора есть Reset (он тоже должен быть правильным)

Добавлено через 10 минут
- конструктор вызывается (должен) в методе GetEnumerator в коллекции

работать должен только односторонне

если метод Reset у энумератора явно реализован (прим. к интерфейсу), то можно привести текущий энумератор к IEnumerator и вызвать
1
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
21.05.2010, 16:09  [ТС] 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   
            List<Point> Result = new List<Point>();
            List<Point> tmp1 = new List<Point>();
            tmp1.Add(new Point(j, i));
            List<Point> tmp2 = new List<Point>();
            while (tmp1.Count != 0)
            { 
                List<Point>.Enumerator en = tmp1.GetEnumerator();
                ((IEnumerator<Point>) en).Reset();
                while(en.MoveNext())
                {
                     //modified tmp2
                }
                Result.AddRange(tmp1);
                tmp1 = tmp2;
             }
Пишет, что был модифицирован tmp1. Если кто сталкивался, то помогите плиз. Желательно кодом
0
Humanitis
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
21.05.2010, 16:59 5
5 строчку поставить после 7
1
nio
5954 / 3360 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
22.05.2010, 10:27 6
сделай через цикл for
0
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
22.05.2010, 12:15  [ТС] 7
Через цикл медленее будет - а мне нужна оптимизация по времени. Я уже решил эту проблему - там 5-ю строчку после 7-й надо было поставить.
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
23.05.2010, 01:28 8
я каэшн рад, что решил, но вот только через цикл будет быстрее, примерно, раз в 150 ! не мудри лишнего
0
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
23.05.2010, 01:45  [ТС] 9
Через цикл будет идти индексация - а чтобы получить i-тый элемент нужно пробежаться по списку до этого элемента. Я на плюсах писал списки, поэтому знаю как все устроенно. А через foreach идет работа с инумератором, проверял лично , а это совсем другое, он просто получает следующий элемент списка
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
23.05.2010, 11:56 10
Howaito Enjeru, прямо не знаю что тут ответить... сравни их чтоль
0
HIMen
4261 / 1428 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
24.05.2010, 03:40 11
Howaito Enjeru, Для больших связанных списков вы правы, но List основан на массиве, у него есть прямой доступ к любому элементу

Mikant, foreach не медленнее for, сам проверял для List и массивов, время примерно одинаковое
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
24.05.2010, 03:56 12
HIMen, опять возьмемся за старое?))) все зависит от размеров! это очень нехорошая практика программирования (когда не знаешь, что есть что)
0
HIMen
4261 / 1428 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
24.05.2010, 03:57 13
Со стековкрфлоу
для массивов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Test
{
    const int Size = 1000000;
    const int Iterations = 10000;
    static void Main()
    {
        double[] data = new double[Size];        
        Random rng = new Random();
        for (int i = 0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }
        double correctSum = data.Sum();
        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j = 0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop: {0}", sw.ElapsedMilliseconds);        
        sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop: {0}", sw.ElapsedMilliseconds);
    }
}
Одинаково.
Там много подобных тестов и в среднем, для массивов одинаково, для List - foreach незначительно долше

Для списков вот хороший материал http://diditwith.net/2006/10/05/PerformanceOfForeachVsListForEach.aspx
1
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
24.05.2010, 14:37  [ТС] 14
Спасибо за инфу
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
24.05.2010, 15:14 15
хм. ну вот картинка из твоего источника... разница в 2.5 раза в среднем...
0
Миниатюры
Enumerators  
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
24.05.2010, 15:17 16
хотя я и не утверждаю, что так и должно быть. тут разница слишком! высока. в среднем "обычный рабочий" foreach раза в полтора медленнее чем for.

зы. сее заявление делаю исходя из собственного опыта: последние 2 года занимаюсь цифрофой обработкой сигналов на C# (далеко не лучший вариант, но все же...)
0
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
24.05.2010, 15:21  [ТС] 17
Цитата Сообщение от Mikant Посмотреть сообщение
зы. сее заявление делаю исходя из собственного опыта: последние 2 года занимаюсь цифрофой обработкой сигналов на C# (далеко не лучший вариант, но все же...)
А что именно за сигналы? Изображения?
0
Mikant
1282 / 954 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
24.05.2010, 15:29 18
не, электроника, если вкратце. я по специальности геофизик по напралению малоглубинной электроразведки: пускаем в землю разные сигналы, смотрим отклики, анализируем, интерпретируем
0
Howaito Enjeru
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 11
24.05.2010, 15:39  [ТС] 19
Жалко =(
0
24.05.2010, 15:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru