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

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

СообщениеДобавлено: 09 май 2017, 13:03
Xtir
Скорее это вопрос по 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, подскажите в какую сторону копать? Заранее спасибо!

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

СообщениеДобавлено: 09 май 2017, 13:05
Xtir
Ах да, забыл добавить, Farm это дочерний объект от Building.

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

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

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

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

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

СообщениеДобавлено: 23 май 2017, 20:26
Xtir
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();
        }

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

СообщениеДобавлено: 23 май 2017, 20:56
samana
Xtir писал(а):Я уже весь мозг сломал себе )))
А то мне приходится вот такие функции клепать для каждого типа

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

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

СообщениеДобавлено: 23 май 2017, 23:17
Xtir
samana писал(а):
Xtir писал(а):Я уже весь мозг сломал себе )))
А то мне приходится вот такие функции клепать для каждого типа

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


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

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

СообщениеДобавлено: 24 май 2017, 20:50
samana
Xtir писал(а):Where(b => b is Farm); а что такое b? Откуда его взять?

Ниоткуда брать не нужно, это автоматическая ссылка на текущий объект из массива, можете написать хоть lololo вместо b.