У меня есть следующий код:Итерация через Generic словарь бросает исключение
private Dictionary<int, Entity> m_allEntities;
private Dictionary<Entity, List<IComponent>> m_entityComponents;
public Dictionary<int, T> GetComponentType<T>() where T: IComponent
{
Dictionary<int, T> components = new Dictionary<int, T>();
foreach (KeyValuePair<int, Entity> pair in m_allEntities)
{
foreach (T t in m_entityComponents[m_allEntities[pair.Key]])
{
components.Add(pair.Key, t);
}
}
return components;
}
m_allEntities = Словарь всех лиц с Key: их ID и значение: объект Entity. m_entityComponents = Словарь всех объектов и их список компонентов с помощью Key: Entity object и Value: это список компонентов.
У меня есть несколько различных классов, реализующих интерфейс IComponents. Предполагается, что должна выполняться функция GetComponentType() - это цикл через все сущности и создание словаря идентификаторов объектов и компонентов определенного типа.
Например: если я хочу, чтобы получить список всех лиц, которые имеют расположение компонентов, то я хотел бы использовать:
entityManager.GetComponentType<Location>();
Проблема, что я бегу в это второй цикл, потому что Безразлично» t, похоже, фильтрует мой словарь. Вместо этого он пытается включить все компоненты в словаре в тип местоположения, который, конечно же, выдает исключение. Как я могу изменить этот код, чтобы он делал то, что я хочу?
Просто попробовал это и .OfType() для меня не является методом. Нужно ли включать дополнительный оператор использования для этой функции или что-то еще? –
Kittoes0124
@ Китто: да, вам нужно пространство имен LINQ. Просто добавьте 'using System.Linq;' –
Я так много думал, должен был просто попробовать добавить LINQ прежде, чем спросить. Мне действительно нравится это решение, потому что мне не нужно что-то делать. Решение ChaosPandion выше также получилось достаточно хорошо. Какой из двух вариантов «безопаснее» и есть ли разница в производительности между этими двумя? – Kittoes0124