Можно ли вернуть список из блока итератора?

У меня есть эта функция:

class Path : List<LineSegment> { }

private IEnumerable<LineSegment> GetLineSegments(CollisionType collisionType, Path path)
{
    if (collisionType == CollisionType.End)
    {
        yield return path.First();
        yield return path.Last();
    }
    else if (collisionType == CollisionType.Segment)
    {
        foreach (LineSegment lineSegment in path)
        {
            yield return lineSegment;
        }
    }
}

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

Кажется немного странным циклически перебирать заданный список, чтобы вернуть весь список. Могу ли я просто вернуть список? Я хотел бы иметь возможность сделать что-то вроде этого, но я получаю ошибки:

private IEnumerable<LineSegment> GetLineSegments(CollisionType collisionType, Path path)
{
    if (collisionType == CollisionType.End)
    {
        yield return path.First();
        yield return path.Last();
    }
    else if (collisionType == CollisionType.Segment)
    {
        return path.AsEnumerable<LineSegment>();
    }
}

1 ответ

Решение

У вас нет выбора, кроме как использовать foreach петля. Это довольно часто запрашиваемая функция, но ее нет в языке.

Другие вопросы по тегам