Преобразование типов

Программирование на Юнити.

Преобразование типов

Сообщение Xtir 09 май 2017, 13:03

Скорее это вопрос по c#, но всё же задам его тут.
Есть такая функция:
Синтаксис:
Используется csharp
public Building[] GetBuildings(BuildingType type)
    {
        List<Building> list = new List<Building>();
        for(int i = 0;  i < myBuildings.Count; ++i)
        {
            if(myBuildings[i].buildingType == type)
            {
                list.Add(myBuildings[i]);
            }
        }

        return list.ToArray();
    }


мне нужно из этого массива получить все объекты типа Farm(ферма), я делаю вот так:
Синтаксис:
Используется csharp
Farm[] farm = player.GetBuildings(BuildingType.Farm) as Farm[];
 

но на выходе всегда получаю Null, подскажите в какую сторону копать? Заранее спасибо!
Последний раз редактировалось Xtir 09 май 2017, 13:06, всего редактировалось 1 раз.
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Преобразование типов

Сообщение Xtir 09 май 2017, 13:05

Ах да, забыл добавить, Farm это дочерний объект от Building.
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Преобразование типов

Сообщение samana 09 май 2017, 19:02

По-идее должно и так работать, если там у вас всё правильно и myBuildings[i].buildingType возвращает правильным тип.
Вообще, просто сначала проверьте тип объектов, и напишите перед if дебаг и узнайте, что возвращает buildingType.
И null ваш метод никак не может вернуть, так как там вернётся максимум пустой массив.
Ещё не уверен на счёт ++i, попробуйте i++
Если ничего не помогло, то попробуйте изменить условие на
Синтаксис:
Используется csharp
if(myBuildings[i] as Farm !=null){}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Преобразование типов

Сообщение seaman 09 май 2017, 19:32

Building[] as Farm[] - так работать не будет!
Если не хотите вручную перебирать foreach-ем, то используйте Linq
Farm[] farm = player.GetBuildings(BuildingType.Farm).Where(b => b is Farm);
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Преобразование типов

Сообщение Xtir 23 май 2017, 20:26

seaman писал(а):Building[] as Farm[] - так работать не будет!
Если не хотите вручную перебирать foreach-ем, то используйте Linq
Farm[] farm = player.GetBuildings(BuildingType.Farm).Where(b => b is Farm);


госпади... #:-s
а как же тогда работает FindObjectsOfType()?
Там ведь тоже массив возвращает Object[], однако в примере написано вот так:
Синтаксис:
Используется csharp
HingeJoint[] hinges = FindObjectsOfType(typeof(HingeJoint)) as HingeJoint[];
 

Как реализовать нечто подобное? Я уже весь мозг сломал себе )))
А то мне приходится вот такие функции клепать для каждого типа
Синтаксис:
Используется csharp
        static Swordsman[] GetSwordsmans(List<Warrior> list)
        {
                List<Swordsman> tempList = new List<Swordsman>();
                foreach (Warrior w in list)
                {
                        if (w is Swordsman)
                        {
                                tempList.Add(w as Swordsman);
                        }
                }

                return tempList.ToArray();
        }

        static Bowman[] GetBowmans(List<Warrior> list)
        {
                List<Bowman> tempList = new List<Bowman>();
                foreach (Warrior w in list)
                {
                        if (w is Bowman)
                        {
                                tempList.Add(w as Bowman);
                        }
                }

                return tempList.ToArray();
        }
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Преобразование типов

Сообщение samana 23 май 2017, 20:56

Xtir писал(а):Я уже весь мозг сломал себе )))
А то мне приходится вот такие функции клепать для каждого типа

Так вам же товарищ seaman показал и посоветовал делать такую выборку с помощью LINQ, в одну строку, что может быть проще?
Да и не кажется ли вам, что ваша архитектура кода создаёт вам же проблемы? Может есть смысл сделать для каждого вида и отдельный массив? Например вы могли бы создать словарь, где ключом был бы тип класса, а значением - массив объектов этого класса. А если нужно перебрать все объекты то просто перебрать весь словарь.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Преобразование типов

Сообщение Xtir 23 май 2017, 23:17

samana писал(а):
Xtir писал(а):Я уже весь мозг сломал себе )))
А то мне приходится вот такие функции клепать для каждого типа

Так вам же товарищ seaman показал и посоветовал делать такую выборку с помощью LINQ, в одну строку, что может быть проще?
Да и не кажется ли вам, что ваша архитектура кода создаёт вам же проблемы? Может есть смысл сделать для каждого вида и отдельный массив? Например вы могли бы создать словарь, где ключом был бы тип класса, а значением - массив объектов этого класса. А если нужно перебрать все объекты то просто перебрать весь словарь.


ну я просто решил немного подругому делать...
Where(b => b is Farm); а что такое b? Откуда его взять?
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Преобразование типов

Сообщение samana 24 май 2017, 20:50

Xtir писал(а):Where(b => b is Farm); а что такое b? Откуда его взять?

Ниоткуда брать не нужно, это автоматическая ссылка на текущий объект из массива, можете написать хоть lololo вместо b.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


cron