LINQ: Из списка типа T получите только объекты определенного подкласса S

Кортеж, распаковывающий:

>>> (a, (b, c), d) = [(1, 2), (3, 4), (5, 6)]
>>> a
(1, 2)
>>> b
3
>>> c, d
(4, (5, 6))

более неясно, можно сделать это в аргументах функции (в Python 2.x; Python 3.x не будет больше позволять это):

>>> def addpoints((x1, y1), (x2, y2)):
...     return (x1+x2, y1+y2)
>>> addpoints((5, 0), (3, 5))
(8, 5)
32
задан Joey 26 July 2009 в 16:28
поделиться

3 ответа

вы можете сделать это:

IList<Person> persons = new List<Person>();

public IList<T> GetPersons<T>() where T : Person
{
    return persons.OfType<T>().ToList();
}

IList<Student> students = GetPersons<Student>();
IList<Teacher> teacher = GetPersons<Teacher>();

EDIT: добавлено ограничение where.

47
ответ дан 27 November 2019 в 20:39
поделиться

Это должно помочь.

var students = persons.Where(p => p.GetType() == typeof(Student));
8
ответ дан 27 November 2019 в 20:39
поделиться

Вы могли бы сделать это:

IEnumerable<Person> GetPeopleOfType<T>(IEnumerable<Person> list)
    where T : Person
{
    return list.Where(p => p.GetType() == typeof(T));
}

Но все, что вы действительно сделали, это переписали метод LINQ OfType () более безопасной версией, использующей проверку статического типа, чтобы гарантировать, что вы передаете Person. Вы по-прежнему не можете использовать этот метод с типом, который определяется во время выполнения (если вы не используете отражение).

Для этого, вместо использования универсальных шаблонов, вам придется сделать переменную типа параметром:

IEnumerable<Person> GetPeopleOfType(IEnumerable<Person> list, Type type)
{
    if (!typeof(Person).IsAssignableFrom(type))
        throw new ArgumentException("Parameter 'type' is not a Person");

    return list.Where(p => p.GetType() == type);
}

Теперь вы можете динамически создавать какой-либо тип и использовать его для вызова этого метода.

2
ответ дан 27 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: