Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819

Массив из ссылок

19.07.2017, 15:05. Показов 9495. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Допустим, есть 2 массива:
C#
1
2
string[] a = new string[2] {"lol", "kek"};
int[] b = new int[3] {1, 2};
Как сформировать массив, который будет содержать не комбинации этих 2-х массивов:
C#
1
2
3
4
5
6
7
array
[
  {"lol", 1},
  {"lol", 2},
  {"kek", 1},
  ...
]
, а ссылки на соответствующие ячейки массивов:
C#
1
2
3
4
5
6
7
array
[
  {a[0], b[0]},
  {a[0], b[1]},
  {a[1], b[0]},
  ...
]
, чтобы лишний раз не использовать память?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2017, 15:05
Ответы с готовыми решениями:

Массив ссылок
Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. не понимаю как это (

Массив из ссылок
есть меню состоящее из ссылок как мне создать массив из этих ссылок используя Control.ControlCollection.Find я пока сразу...

Массив ссылок на jquery
Приветствую ребята! Подскажите как на jquery реализовать массив ссылок? То есть много ссылок на внешние ресурсы. Во фрейме они грузятся...

38
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
20.07.2017, 19:58  [ТС]
Студворк — интернет-сервис помощи студентам
Так нет же - я как раз обновляю лишь один набор индикаторов, который является массивом all_ma, а потом составляю из них комбинации.

Проблема в том, чтобы рационально составлять комбинации.
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
20.07.2017, 20:07
Ваш вариант тестера имеет очень сложное состояние (state) - ну, потому что он пытается прожевать больше, чем в рот входит.
Из этого вытекают такие проблемы:
сложность в сопровождении (трудно разом следить за всеми комбинациями);
невозможность остановить тестер раньше срока, промежуточные данные будут потеряны (из-за сложности сохранения состояния тестера);
неоправданный расход памяти;
0
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
20.07.2017, 20:11  [ТС]
Fleder,
Следить за всеми комбинациями нет надобности, тк опираться будем на отчёт по окончании теста
С остановкой нет проблем, зачем сохранять состояние тестера, если оно определенно на текущий момент?
Неоправданный расход в памяти - поясните?) Каждый индикатор удаляет за собой значения, которые уже не нужны, поэтому если период MA равен 2, то для 60 версий данного индикатора будет занято максимум 120 значений для корректной работы.
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
20.07.2017, 20:26
Дело в том, что отчёт будет получен по окончании теста. А если тест будет длиться, скажем, сутки? И рубанут свет? И что? Всё заново!!!

Добавлено через 9 минут
Расход памяти:
Вы оптимизируете параметры индикаторов?
Предположим, что в ТС всего одна машка, и оптимизация идёт по периоду сглаживания и по сдвигу.
Например, получилось 100 вариантов этой машки.
И зачем держать в памяти сразу 100 разных буферов, если можно держать только один буфер для одного прохода?
0
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
20.07.2017, 20:48  [ТС]
Fleder, 100 буферов быстрее прогонятся, чем 100 проходов. Самая тормознутость - в симуляции дня. При чистых параметрах, просто при формировании свечек, уходит 15 секунд одного дня.

Цитата Сообщение от Fleder Посмотреть сообщение
И рубанут свет? И что?
На этот момент есть ИБП )

По моим подсчётам, 10000 вариантов будет тестироваться не больше 30 минут для одного дня.

Цитата Сообщение от Fleder Посмотреть сообщение
А если тест будет длиться, скажем, сутки?
Кстати, на счёт промежуточных регистраций данных тоже всё ок - по окончанию дня (или в любой другой момент времени) сохранять отчёт на текущий момент. В этом нет никакой сложности.

Не по теме:

Почему одни оффтопы от Вас? Мне лишь нужно оптимизировать составление комбинаций - вот и всё! На счёт того,
какой выбирать мне путь - я разберусь сам, спасибо

0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
21.07.2017, 04:06
Цитата Сообщение от Rodion2703 Посмотреть сообщение
Diamante, если делать через foreach или другие циклы, то для 2 экземпляров TimeFrame_class по 3 индикатора (наподобие MA) будет 6 циклов) Один раз уже кое-кто пробовал, вот, что получилось
На самом деле вам верно указали: что бы сформировать данный массив вам один чёрт понадобится кучка вложенных циклов. Разница только в том, что вы хотите сохранить результат прогона этих циклов, а вам предложили проводить тест над каждой комбинацией параметров получаемой на каждой же итерации, без сохранения в виде отдельного массива.

Вам же этот массив, насколько я понял, всё равно не нужен никак кроме как для прогона тестов. Почему бы не сделать это заместо формирования этого массива? Вот это и будет экономия памяти, о которой вы так печётесь (тут не то, что лишних объектов классов не будет, тут даже массива ссылок не будет).

Заверните "генератор комбинаций" в итератор (настоящий IEnumerable<T> или в метод возвращающий IEnumerable<T> с помощью yield return. И уже этот итератор скормите прогонщику тестов.

Профит будет явный - нет даже массива мутного (со всем мутным же кодом, который понадобился бы для работы с этим массивом).

Цитата Сообщение от Rodion2703 Посмотреть сообщение
Один раз уже кое-кто пробовал, вот, что получилось
Лично мне этот скриншот ни о чём не говорит. Кто-то фигнёй маялся.
1
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
21.07.2017, 11:51  [ТС]
Usaga, смотрите, в чем смысл

Есть много так называемых ТаймФреймов, где хранятся некие индикаторы.

Есть функция Process_Candle, которая вызывается очень много раз, в начале которой обновляются значения всех индикаторов.

Так как значения у индикаторов новые, то необходимо обновлять массив, с которым столько раз, сколько комбинаций можно составить из индикаторов. И так происходит каждый вызов функции Process_Candle

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

Допустим, у нас есть N ТаймФреймов, где находится M индикаторов: Ind1, Ind2, ..., Ind_m. (у меня индикатор называется MA)

У каждого индикатора есть по K версий, то есть они аналогичные индикаторы, только 1-ый считает среднеарифметическое, 2-ой среднее геометрическое и тд.

Всего комбинаций у нас N * K ^ M.

Если делать 1 массив, в котором будут хранится все комбинации, то у нас будет K ^ M одинаковых таймреймов для каждого n таймрейма, M * K одинаковых индикаторов для каждой версии (хм, точно не знаю, но лишние точно будут)

ТаймФреймов у меня 2, примерно по 5 индикаторов в каждом ТаймФрейме и примерно по 5 версий индикаторов - 6250 вариаций, комбинаций.

Представьте, как это хранить столько данных в одном массиве?) Причём еще обновлять их

Но! Если не создавать лишних версий индикаторов, то так как число версий M каждого индикатора, то обновлять нужно будет N * K * M версий. (50 версий!! не 6250)

Либо я не понимаю Вас, и Вы мне говорите то же самое) Либо, я плохо объясняю ситуацию) (хотя с последним всегда были проблемы )

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

Та самая MyLovelyFunc:

Пока-что она использует только 4 варианта для Par1, 8 вариантов для tf[0].all_ma[0] и 10 вариантов для tf[0].ma[1]: 240 комбинаций (считает 1 неделю за 5 минут; раньше бы считало за день при параллельном тестировании)

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
// Обработка текущего состояния текущей свечи
void ProcessCandle(Candle _Candle, int tf_i)
{
    tf[tf_i].Process_Candle(_Candle);
 
    if (tf_i == Series_CNT - 1) // Все ТФ на текущий момент сформированны
    {
        CurrentPrice = _Candle.ClosePrice;
 
        int k = -1;
        foreach (var _0ma0 in tf[0].all_ma[0])
            foreach (var _0ma1 in tf[0].all_ma[1])
                foreach (var _1ma0 in tf[1].all_ma[0])
                    foreach (var _par1 in Common_Combos["Par1"])
                        foreach (var _par2 in Common_Combos["Par2"])
                        {
                            k++;
 
                            tf[0].ma[0] = _0ma0;
                            tf[0].ma[1] = _0ma1;
                            tf[1].ma[0] = _1ma0;
                                            
                            Par1 = _par1;
                            Par2 = _par2;
 
                            if (CurrentPosition[k] == 0)
                                Process_EnterRules(k);
                            else
                                Process_ExitRules(k);
                            }
                        }
    }
}
По переменной k я определяю номер комбинации. Неудобство ещё и в том, что зная номер комбинации, нужно опять прогнать данный цикл, чтобы достать комбинацию по k`му номеру
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
21.07.2017, 12:24
Rodion2703, я как раз предлагаю НЕ создавать массив. Итератор у вас с массивом ассоциируется, что ли? Я предлагаю создать генератор комбинаций, который будет их (комбинации) выдавать по одной, по запросу. Код этого генератора уже выше привели, осталось его переработать, что бы он не брал данные из того же источника, куда сам данные записывает и готово.
1
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
21.07.2017, 12:33  [ТС]
Usaga, то есть, реализация итератора будет выглядеть примерно вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        _tf = new TimeFrame_class[] ...;
        foreach (var _0ma0 in tf[0].all_ma[0])
            foreach (var _0ma1 in tf[0].all_ma[1])
                foreach (var _1ma0 in tf[1].all_ma[0])
                    foreach (var _par1 in Common_Combos["Par1"])
                        foreach (var _par2 in Common_Combos["Par2"])
                        {
                            k++;
 
                            _tf[0].ma[0] = _0ma0;
                            _tf[0].ma[1] = _0ma1;
                            _tf[1].ma[0] = _1ma0;
                                            
                            yield return _tf;
                            }
                        }
А реализация моей функции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Обработка текущего состояния текущей свечи
void ProcessCandle(Candle _Candle, int tf_i)
{
    tf[tf_i].Process_Candle(_Candle);
 
    if (tf_i == Series_CNT - 1) // Все ТФ на текущий момент сформированны
    {
        CurrentPrice = _Candle.ClosePrice;
 
        int k = -1;
        foreach (var tf in MyIterator.GetEnumerator())
        {
            k++;
            if (CurrentPosition[k] == 0)
                Process_EnterRules(k);
            else
                Process_ExitRules(k);
        }
?
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
21.07.2017, 12:37
Лучший ответ Сообщение было отмечено Rodion2703 как решение

Решение

Rodion2703, примерно да. Только скорее так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        _tf = new TimeFrame_class[] ...;
        foreach (var _0ma0 in tf[0].all_ma[0])
            foreach (var _0ma1 in tf[0].all_ma[1])
                foreach (var _1ma0 in tf[1].all_ma[0])
                    foreach (var _par1 in Common_Combos["Par1"])
                        foreach (var _par2 in Common_Combos["Par2"])
                        {
                            k++;
 
                            var someResultItem = new SomeResultItem {
                                Item1 = _0ma0,
                                Item2 = _0ma1,
                                Item3 = _1ma0
                            };
                            yield return someResultItem;
                            }
                        }
1
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
22.07.2017, 12:46  [ТС]
Usaga, большое спасибо! Не до конца понимал, что мне хотят донести)

Добавлено через 23 часа 58 минут
!!!!!!!!!!! Оказалось всё намного проще, чем я думал...

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
class Man
{
    public String Name { get; set; }
    public int Age { get; set; }
}
 
class Program
{
    static void Main(string[] args)
    {
        Man p1 = new Man() { Name = "Sam", Age = 20 };
        Man p2 = p1;
 
        p1.Age = 25;
 
        Console.WriteLine("{0} {1}", p1.Name, p1.Age); // Sam 25
        Console.WriteLine("{0} {1}", p2.Name, p2.Age); // Sam 25
 
        p2.Name = "Robert";
 
        Console.WriteLine("{0} {1}", p1.Name, p1.Age); // Robert 25
        Console.WriteLine("{0} {1}", p2.Name, p2.Age); // Robert 25
 
        Console.ReadKey();
    }
}
Моя неграмотность сыграла со мной злую шутку) Получается, присваивая экземпляр класса (со структурой такое не прокатит) разным переменным, мы работаем с одним и тем же экземпляром, но через разные переменные..

Это и было то, что я имел ввиду (массив ссылок)

Вначале просто создаём массив из комбинаций, но главное не создавая новые экземпляры.
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
22.07.2017, 15:25
Rodion2703, это называется "ссылочный тип данных". Вам об этом во втором или третьем посте сказали...
0
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
22.07.2017, 15:27  [ТС]
Usaga, да, уже почитал) reference тип..

Извините за беспокойство)

Добавлено через 14 секунд
Usaga, да, уже почитал) reference тип..

Извините за беспокойство)
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
22.07.2017, 15:31
Rodion2703, кстати, вариант с генератором комбинаций всё равно свою силу не утрачивает.
0
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
22.07.2017, 15:35  [ТС]
Usaga, а в чём его польза?) Сейчас делаю так перед тестированием:
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
/**
    * НАСТРОЙКИ TF`ов
    **/
 
List<TimeFrame_Settings> TFS = new List<TimeFrame_Settings>
{
    new TimeFrame_Settings(Buffers, 0, 1),
    new TimeFrame_Settings(Buffers, 2),
};
 
TFS[0].Set_MA_Combos(0, new List<int> { }, new List<MaType> { }, new List<CalculationType> { });
TFS[0].Set_MA_Combos(1, new List<int> { }, new List<MaType> { }, new List<CalculationType> { });
 
/**
    * ОБЩИЕ НАСТРОЙКИ
    **/
 
Dictionary<String, List<Object>> CS = new Dictionary<String, List<Object>>(); // Common Settings
CS["TakeProfit"] = new List<Object> { 0 };
CS["StopLoss"] = new List<Object> { 0 };
CS["StarTime"] = new List<Object> { new TimeSpan(10, 30, 0) };
CS["StopTime"] = new List<Object> { new TimeSpan(19, 30, 0) };
 
/**
    * ФОРМИРОВАНИЕ КОМБИНАЦИЙ
    **/
 
Combos_CNT = // Рассчёт числа комбинаций из TFS и CS
    CS.Select(x => x.Value.Count).Aggregate((p, x) => p *= x) *
    TFS.Select(x => x.Combos_Count).Aggregate((p, x) => p *= x);
 
TimeFrame_Sample[][] combo = new TimeFrame_Sample[Combos_CNT][];
 
int k = -1;
foreach (var _0buffer in TFS[0].Buffers)
    foreach (var _1buffer in TFS[1].Buffers)
        foreach (var _0ma0 in TFS[0].ma[0])
        ...
        {
            ...
        }
Перед формированием комбинаций создаю комбинации для всех индикаторов, потом заполняю через циклы в массив combo.

Если же делать итератор, то он пригодится только 1 раз) Пропала необходимость одного и того же перечисления несколько раз)

Или для чего он еще полезен?
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
22.07.2017, 15:43
Rodion2703, польза итератора в том, что не требуется промежуточный массив, данные выгребаются только по мере надобности. Особенно это полезно, когда данные "бесконечные" или их ну очень много. Можно одновременно (если нужно) создавать множество итераторов над одними и теми же данными или сбрасывать (если предусмотрено итератором) уже имеющийся.

В принципе, я не настаиваю. Если вас ваше текущее решение устраивает, то ладно
1
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
22.07.2017, 15:47  [ТС]
Usaga, разве итератор не возвращает как раз таки промежуточный массив?

Мне кажется, итератор здесь будет лишним, но всё равно спасибо)
0
Эксперт .NET
 Аватар для Usaga
14335 / 9428 / 1357
Регистрация: 21.01.2016
Сообщений: 35,545
22.07.2017, 15:50
Rodion2703, итератор возвращает данные по запросу, по одной штуке\классу, а не весь возможный набор. В этом его фишка.
0
 Аватар для Rodion2703
24 / 20 / 5
Регистрация: 06.01.2013
Сообщений: 819
22.07.2017, 16:02  [ТС]
Usaga, да, я понимаю) Неправильно выразился: возвращает не промежуточный массив, а текущие данные, признаю.

В моём случае, думаю, надобности в создании отдельного итератора для создания комбинаций нету, т.к. если его и использовать по назначению, то только напрямую в функции. Просто, легче вызвать нужный массив по уже составленной комбинации под i`ым номером combo[i], чем каждый раз создавать в функции одни и те же комбинации)

Reference тип - прям то, что было нужно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2017, 16:02
Помогаю со студенческими работами здесь

Редактировать массив ссылок
у меня есть массив ссылок, вида: ./i2018i217.html Мне нужно на все такие ссылки попереходить. Но проблема в том, что они начитаются на...

Массив ссылок на функции
Объясните где ошибка: #include &lt;iostream&gt; void minimum (int*,int); void maximum (int*,int); void average (int*,int); int...

Массив ссылок и for auto
Создаю массив std::array ссылок, для ссылок создаю объекты через new, а потом удаляю, можно ли в цикле использовать auto? ...

Массив ссылок на TEdit
Имеются уже созданные компоненты edit1, edit2, ... ,edit16 . Надо присвоить массиву ссылки на эти компоненты. Массив : edt: array of...

Задача на указатели. Массив ссылок
Доброго времени суток)) Решаю такую задачку: Дан массив ссылок на вещественные числа. Проверить, есть ли в массиве хотя бы два...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru