Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/17: Рейтинг темы: голосов - 17, средняя оценка - 5.00
kodges
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 11
1

Циклическое наполнение/удаление элементов массива

26.02.2014, 08:59. Просмотров 3114. Ответов 24
Метки нет (Все метки)

Суть вопроса в следующем. Есть массив размером в 21 элемент.
При каждой итерации в массив заносится новый элемент начиная с 0 и до 21. Как только все индексы массива становятся заняты и добавлять новый уже некуда, из массива удаляется самый первый элемент, и добавляется новый элемент в конец массива. И так бесконечно... OnTick() выполняется каждую секунду.
Но почему то через 21 итерацию выдается ошибка:
Crashed in OnTick with IndexOutOfRangeException: Индекс находился вне границ массива.

Что я делаю не так ? Помогите пожалуйста. Я новичок в C#.
Вот мой код:
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
int k = -1, maxTick  =  21;
double[] ticks = new double[21];
 
        protected override void OnTick()
        {
            double Bid = Symbol.Bid;
            double Ask = Symbol.Ask;
            double Point = Symbol.TickSize;
 
               k++;
               ticks[k] = Bid;
 
             if (k == maxTick - 1)
             {
                k--;
                ticks = Delete(ticks.ToList(), 0);
             }
        }
 
        static double[] Delete(List<double> array, int indexToDelete)
        {
            array.RemoveAt(indexToDelete);
            return array.ToArray();
        }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2014, 08:59
Ответы с готовыми решениями:

Удаление элементов из массива
Как удалить отрицательные элементы между двумя положительными?

Удаление элементов из массива
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы,...

Удаление элементов массива
Всем доброго времени суток. Мне нужно удалить первые элементы массива до...

Удаление элементов из массива
Кто может помочь с алгоритмом удаления? Вот задание: удалить элементы, значение...

Удаление повторяющихся элементов массива
Ребят, как можно вывести только неповторяющиеся элементы массива двумерного???...

24
Andrew_Guchko
8 / 8 / 6
Регистрация: 14.06.2013
Сообщений: 65
01.03.2014, 15:04 21
C#
1
2
3
4
5
6
7
8
9
10
11
12
int i=0;
            int[] mass = new int[21];
            for (i=0;i<mass.Length; i++)
            {
                do
                {
                    Int32.TryParse(Console.ReadLine(), out mass[i]);
                    if (Int32.TryParse(Console.ReadLine(), out mass[i]) != true) Console.WriteLine("Entr correct number");
                }
                while (Int32.TryParse(Console.ReadLine(), out mass[i]) != true);
                if (i == mass.Length-1) i = 0;
            }
0
kodges
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 11
02.03.2014, 19:43  [ТС] 22
Цитата Сообщение от insite2012 Посмотреть сообщение
Так вы сформулируйте, что же Вам надо... Сначала разговор шел об очереди, то есть первым элемент добавлен - первым и извлечен из очереди. Я Вам привел пример. Он не подходит. Тогда сформулируйте Вашу задачу, как можно более конкретнее...
Мне надо хранить пары элементов в виде: ключ = значение. Ключом является метка времени Unix Timestamp, значением является десятичное число (но можно и целое число, если с ним будет проще я приведу десятичное к целому).

Видимо массив мне не подходит, как уже сказали лучше всего подходит для хранения таких пар, список List.

Заполняется этот список в бесконечном цикле (бесконечный вызов метода каждую секунду). И в этом же цикле при каждой итерации происходит работа с этим списком, то есть перебирается то что уже есть в списке новым циклом и по ключу (метке времени) извлекаются нужные значения, а не нужные (устаревшие) удаляются чтобы не разрастался список.

Извлекаться будет примерно так: если текущая метка времени минус (например 120 секунд) >= метка времени в ключе списка, то берем это первое значение и работаем с ним, все что старше по времени удаляем из списка.

Вот примерно такая реализация мне нужна. Таким образом список будет постоянно пополняться новыми парами в цикле 1, и одновременно на каждой итерации этого цикла будет производиться проверка и удаления старых пар записей из списка.

Массив уже не подходит хотя бы потому что в нем надо указывать размер индекса. А так как у меня индексом будет метка времени которая меняется постоянно, то соответственно постоянно будет получаться ошибка что индекс находится вне границ массива. Как то так.

Вот как это реализовать ?

Добавлено через 23 часа 45 минут
Ну кто поможет с решением ? Неужели решения нет?
0
insite2012
Модератор
Эксперт .NET
4865 / 3818 / 1096
Регистрация: 12.10.2013
Сообщений: 11,095
Записей в блоге: 2
02.03.2014, 20:35 23
Так уже не раз говорилось, ну создайте свой класс с нужными параметрами список типа этого класса. В чем проблема?
Вот простой пример, подгоняйте под свою задачу, ничего сложного тут нет...
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
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication31
{
    class Program
    {
        static void Main(string[] args)
        {
            List<MyData> DataList = new List<MyData>();
            for (int i = 0; i < 100; i++)
            {
                DataList.Add(new MyData(new DateTime(2014, 1, 23), i));
                if (i % 2 == 0)
                    DataList.Clear();
            }
            foreach (var item in DataList)
                Console.WriteLine("{0},{1}", item.key, item.val);
            Console.Read();
        }
    }
    class MyData
    {
        public MyData(DateTime dt, int v)
        {
            key = dt;
            val = v;
        }
        public DateTime key
        {
            get;
            set;
        }
        public int val
        {
            get;
            set;
        }
    }
}
0
kodges
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 11
02.03.2014, 22:16  [ТС] 24
Ну вот я сделал по вашему примеру.
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
        int Time = (int)(Server.Time - new DateTime(1970, 1, 1)).TotalSeconds;
 
        DataList.Add(new MyData(Time, 3.14));
 
 
        foreach (var item in DataList)
        {
                if (Time - 120 > item.key)
                {
                    DataList.Remove(item.key);
                }
        }
 
 
        class MyData
        {
            public MyData(int uts, double price)
            {
                key = uts;
                val = price;
            }
            public int key { get; set; }
            public double val { get; set; }
        }
Но как мне удалять элементы из этого списка по ключу? DataList.Remove(item.key); Не работает, говорит DataList.Remove имеет несколько недопустимых аргументов.

Добавлено через 19 минут
С удалением справился так:
C#
1
2
3
4
5
6
7
            for (int i = 0; i < DataList.Count; i++)
            {
                if (Time - 120 > DataList[i].key)
                {
                    DataList.RemoveAt(i);
                }
            }
Но не понимаю как сделать проверку без лишнего цикла на существование элемента с заданным ключом.
Нужно что-то типа такого:
C#
1
2
3
4
if (DataList.IndexOf(Time) == -1)
{
        DataList.Add(new MyData(Time, 3.14));
}
0
insite2012
Модератор
Эксперт .NET
4865 / 3818 / 1096
Регистрация: 12.10.2013
Сообщений: 11,095
Записей в блоге: 2
03.03.2014, 00:05 25
То есть, Вам надо решить, есть ли элементы с таким ключом и если нет, то добавить. Так?
Ну в таком случае используйте обычный словарь, и ничего придумывать не надо.
0
03.03.2014, 00:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 00:05

Добавление и удаление элементов массива
Есть динамический массив А с кол-вом эл-тов n Весь массив заполнен (от 1 эл-та...

Удаление элементов из ступенчатого массива
Здравствуйте, уважаемые. Все голову уже сломал, но никак не могу додуматься,...

Удаление четных элементов из массива
Помогите разобраться с проблемой. При помощи данного метода пытаюсь удалить из...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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