Кортеж, распаковывающий:
>>> (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)
вы можете сделать это:
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.
Это должно помочь.
var students = persons.Where(p => p.GetType() == typeof(Student));
Вы могли бы сделать это:
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);
}
Теперь вы можете динамически создавать какой-либо тип и использовать его для вызова этого метода.