C #: цепочечные методы Linq и приведение - PullRequest
2 голосов
/ 09 июля 2011

У меня есть небольшая игра, в которой я реализовал некоторое обнаружение столкновений.Теперь я хочу получить список всех элементов определенного типа, которые сталкиваются с текущим объектом "Entity".Я хочу сделать что-то вроде этого:

    public List<T> GetCollidingObjects<T>() where T : Entity
    {
        return this.Game.World.Entities
            .AsParallel()
            .Where(e => e.IsColliding(this))
            .Where(e => e is T)
            .ToList<T>();
    }

Я получаю следующую ошибку:

Instance argument: cannot convert from "System.Linq.ParallelQuery<GameName.GameObjects.Entity>" to "System.Collections.Generic.IEnumerable<T>"

Может кто-нибудь объяснить, почему это происходит?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 09 июля 2011

Вы не можете использовать ToList() таким образом.Предоставляемый вами универсальный параметр (если вы решите это сделать) должен соответствовать типу последовательности.Это последовательность Entity, а не T.

В любом случае, вы должны использовать OfType() для фильтрации, вот для чего она нужна.

public List<T> GetCollidingObjects<T>() where T : Entity
{
    return this.Game.World.Entities
        .OfType<T>()
        .AsParallel()
        .Where(e => e.IsColliding(this))
        .ToList();
}
0 голосов
/ 09 июля 2011

Джефф Меркадо ответил правильно, но его можно сформулировать более просто.

.Where(e => e is T)

Этот вызов Enumerable.Where<Entity> возвращает IEnumerable<Entity> (отфильтрованная версия источника, которая является IEnumerable<Entity>).Вызов не возвращает IEnumerable<T>.

Enumerable.Select<TSource, TResult>, и Enumerable.OfType<TResult> может возвращать IEnumerable с типом, отличным от источника:

.Where(e => e is T)
.Select(e => e as T)

или

.Select(e => e as T)
.Where(e => e != null)

или

 .OfType<T>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...