Как использовать Foreach в списке базовых типов в C # - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть список типа GameObject с именем «Within» в каждой из моих плиток.

List<GameObject> Within = new List<GameObject>();

GameObject имеет производные классы типов Bee, Flower и Tree.

Я делаю foreach, который должен обнаружить всех пчел в списке и выбрать или отменить их выбор.

foreach (Bee bee in Tile.Within)
{
    bee.selected = !bee.selected;
}

Проблема заключается в том, когда я делаю это, если в списке есть объекттипа Flower или Tree, я получаю исключение:

"Unable to cast object of type 'WindowsGame2.Flower' to type 'WindowsGame2.Bee'."

Я думал, что foreach будет игнорировать все объекты, которые не вписываются в описание, когда мы его вызываем, но этоне ... Как я могу заставить его работать?

Ответы [ 5 ]

8 голосов
/ 01 декабря 2011

А как насчет фильтрации с использованием LINQ внутри foreach?

foreach (Bee bee in Tile.Within.OfType<Bee>())
{
    bee.selected = !bee.selected;
}

Это выберет только пчелы, а не цветы или деревья.

2 голосов
/ 01 декабря 2011

foreach можно изменить следующим образом:

foreach (GameObject gameObj in Tile.Within) 
{
    Bee bee = gameObj as Bee;
    if(bee != null)
    {
        bee.selected = !bee.selected; 
    }
} 
1 голос
/ 01 декабря 2011

foreach не работает таким образом. Он просто «приведёт» объект к запрошенному типу.

Так что вам нужно либо фильтровать заранее (что может создать мусор, если вы используете Xbox360, это может быть проблемой), либо фильтровать в цикле.

Есть несколько способов сделать это, вращаясь вокруг использования либо as, либо is, либо обоих. Например:

foreach (GameObject gameObj in Tile.Within) 
{
    if (gameObj is Bee)
    {
        Bee bee = (Bee)gameObj;
        bee.selected = !bee.selected; 
    }
} 
1 голос
/ 01 декабря 2011

Вы можете использовать LINQ в своем проекте?

foreach (Bee bee in Tile.Within.Where(o=>o is Bee))
{
    bee.selected = !bee.selected;
}
0 голосов
/ 01 декабря 2011

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

foreach (var item in Tile.Within)
{
    if (item is Bee)
    {
        ((Bee)item).Selected = !((Bee)item).Selected;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...