Страница 1 из 2

Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 02 июл 2017, 14:31
greatPretender
Нужно сделать массив из методов, в каждый из которых передаются сразу параметры.
Типа такого:
Синтаксис:
Используется csharp
Action[] ArrProbe;
void Start () {
    ArrProbe = new Action[]{Call (numbSub, numbSub), Call (1,2), Call (1,1)}
}
void Call(int type, int count){
}

Но массив по сути будет состоять из одного и того же метода, но с разными параметрами
Юнька ругается : "Cannot implicitly convert type `void' to `System.Action'". Это понятно. Но как это исправить?
Может кто знает как?
Без параметров почему-то работает. Просто методов предполагается штук 15 и из вызов зависит от рандома, т.е. городоить switch/if ваще не вариант.
Заранее спасибо.)

Re: Как сделать Массив из методов с параметрами

СообщениеДобавлено: 02 июл 2017, 14:48
greatPretender
Засунул всё в словарь.
Синтаксис:
Используется csharp
DictProbe = new Dictionary <int, Action> {
    {1, () => Call (numbSub, numbSub)},
    {2, () => Call (1, 2)},
    {3, () => Call (numbSub, numbSub)},
    {4, () => Call (numbSub, numbSub)}
};

Не знаю, будет ли работать, но ошибка ушла.
Норм?))

Re: Как сделать Массив из методов с параметрами

СообщениеДобавлено: 03 июл 2017, 08:23
olegknyazev
По-моему отличное решение! :)

Re: Как сделать Массив из методов с параметрами

СообщениеДобавлено: 03 июл 2017, 12:07
snezhok_13
greatPretender писал(а):Юнька ругается : "Cannot implicitly convert type `void' to `System.Action'". Это понятно. Но как это исправить?
Может кто знает как?

Здесь происходит вычисление общего типа для массива, так как вы написали вызов метода, а не имя метода, то тип этой конструкции = типу возвращаемому из метода, тоесть - void. Вам помогут лямбды, и вы их использовали, но все равно терзают смутные сомнения о нужде в таком подходе :)

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 03 июл 2017, 18:57
greatPretender
Задебагил. Работает. Радостно. )
Я не шарю в проганьи; лямбы, экшэны и делегаты я до сих пор не могу прочухать без словесного человеческого объяснения, поэтому пользую, что робит.)
Конструкция нужна для того, чтобы при постоянных выкидывания рандомного значения от 0 до 100%, мне нужно смотреть какой процент получается и в какой критерий она попадает. Критерии это массивы [10%, 30%, 35%, 80%] - примерно так, они ещё и меняются.
По номеру элемента в массиве я получаю какая функция должна сработать. И её беру из словаря по ключу , совпадающему с номером элмента в массиве ))) хех, вот такой велосипед)

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 04 июл 2017, 09:13
seaman
Если метод один и тот же, только параметры разные - можно держать в массиве не методы а параметры.

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 04 июл 2017, 12:50
greatPretender
seaman писал(а):Если метод один и тот же, только параметры разные - можно держать в массиве не методы а параметры.

Это да, но ведь тут не будет выигрыша ни в оптимизации, ни в строках кода. Или я не прав?
Да и скорей всего у меня будет не один метод в словаре.
++++++++++++++++
Меня вот больше другое заботит.
У меня словарь раздулся пока до 15 парк ключ-значение. Этот словарь у меня играет роль хранилища, просто даёт значение по ключу.
А есть ещё один словарь на те же 15 соотв-нно пар, там хранятся критерии выпадения этих методов (в процентах).
Т.е. например, рандом выдал цифру 78%, а он в словаре допустим в конце:
{5%, 10%, 12%, 15%, 30%, 45%, 60%, 65%, 66%, 69%, 70%, 75%, 80%, 85%, 90%, 100%}
и подпадает под критерий 80%.
То чтобы выпал метод, который выпадает с таким знач-е процентов, foreach должен пробежать первые сколько там 12 значений на проверку 78% < 80%, прежде чем получу нужный ключ.
А потом будут вместо этого другие словари , где будет много нулей и 80% будет в конце.
Вот и вопрос: Сильно ли это напряг , если это будет вызывать раз 4-10 сек корутиной в контексте кучи других вычислений?
Это для ИИ и это 1/30 примерно его вычислений в стратегии боя.
Может есть другие структуры, которые сразу выдают значение по схеме "ключ-значение", а не так, перебирая?

Или я парюсь, и эта капля в море современных возможностей вычисления, ведь это 3д-графика?)))

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 04 июл 2017, 13:23
ilkalawson
так и ищите по ключу свое значение вместо перебора всех елементов.
Синтаксис:
Используется csharp
try {
 var value = dictionary[key];
} catch(Exception e) {}

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 04 июл 2017, 19:01
greatPretender
ilkalawson писал(а):так и ищите по ключу свое значение вместо перебора всех елементов.
Синтаксис:
Используется csharp
try {
 var value = dictionary[key];
} catch(Exception e) {}

Try-catch ещё не юзал, не мог понять чёза зверь. Сейчас вроде нашёл внятное описание. Интересно, но ...
Не понял как мне сделать обработку исключений в моё примере.
Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))
И интересно как внутренне работает try-catch, не будет ли его подход избыточно грузить, чем просто перебор foreach такого относительно небольшого словаря))

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 06 июл 2017, 10:58
samana
greatPretender писал(а):Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))


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

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 07 июл 2017, 11:39
greatPretender
samana писал(а):
greatPretender писал(а):Ситуация:
1. допустим рандом мне дал число rnd=78%.
2. мне нужно получить ключ , который соотв-ет условию: rnd<(минимального значения в словаре) , т.е. получается соотв-ет значению 80%.
3. получаем номер ключа = 13.
Вопрос:
Какой мне нужно написать код, чтобы обрабатывал этот запрос без for и foreach. Подскажите, я не догоняю.))


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

Нее, у меня же словарь не из сто элементов , типо {1, 2, 3, ... 99, 100}, чтобы вот так слёту получать по каждому проценту вероятности нужный ключ. А интервалами сделано 5%, 11%, 22% => 5%, 16%, 38%.
Ладно, оставлю перебор foreach пока. Просто интересно было так, на будущее, как это через try-catch можно сделать.)

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 07 июл 2017, 12:15
samana
Не, не, я думал так:

Синтаксис:
Используется csharp
Dictionary<int, System.Action> dic = new Dictionary<int, System.Action>();
dic.Add(1, () => Debug.Log("1 %"));
dic.Add(12, () => Debug.Log("12 %"));
dic.Add(53, () => Debug.Log("53 %"));
dic.Add(88, () => Debug.Log("88 %"));

int rand = Random.Range(0, dic.Count); // случайное число от 0 до 3
int[] keys = dic.Select(x => x.Key).ToArray(); //создаём массив ключей словаря, можно создать где-то единожды
dic[keys[rand]].Invoke(); //вызываем случайный Action из словаря
}


p.s. Try-catch просто позволяет словить ошибку и обработать её без сбоя приложения. В вашем случае я не знаю как он может пригодится.

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 07 июл 2017, 16:18
ilkalawson
Просто интересно было так, на будущее, как это через try-catch можно сделать

в случае если у вас отсутствует ключ вы получите ошибку, try catch позволяет просто обойти эту ошибку без остановки всего приложения.
Samana прав, в случае когда известно что ключ точно существует эта схема с исключением не нужна.
можно без Select
Синтаксис:
Используется csharp
int[] keys = dic.Keys.ToArray();// using System.Linq
int rand = Random.Range(0, keys.Lenght); // случайное число от 0 до 3
dic[keys[rand]].Invoke(); //вызываем случайный Action из словаря

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 07 июл 2017, 17:25
samana
ilkalawson писал(а):можно без Select
Синтаксис:
Используется csharp
int[] keys = dic.Keys.ToArray();

О, отлично, даже как-то и не знал об этом! Спасибо!

Re: Как сделать Массив из методов с параметрами [РЕШЕНО]

СообщениеДобавлено: 07 июл 2017, 20:26
greatPretender
Всё понял, но у меня чуток сложнее пример, но суть я уловил, сделаю, спасибо))