Оскільки нас не цікавить номер елементу в масиві, а результат пошуку, як я розумію, не обов'язково має бути останнім (нас влаштовує будь-який елемент з відповідною характеристикою, так?), то
public Student GetStudentForBirth(DateTime d) {
foreach(Student st in students) {//foreach безпечніший за for, якщо його можна застосувати
if(st.Birth == d) {
return st;//перериваємо цикл
}
}
}
Потім, операція & - це бітове І, на відміну від логічного &&. Результат що &, що && для булевих значень однаковий, але && швидша, бо не обчислює другий операнд, якщо перший false. Тому
if((students[i].Firstname == f) && (students[i].Lastname == l))
Ну і, нарешті, List має вбудований метод Find, який робить саме те, що треба, але потребує додаткової функції для порівняння. Цю функцію можна зробити анонімною:
public Student GetStudentForBirth(DateTime d) {
return students.Find( (st) => (st.Birth == d) );
}
public Student GetStudentForName(string f, string l) {
return students.Find( (st) => ( (st.Firstname == f) && (st.Lastname == l) ) );
}
і навіть додати додатковий метод для пошуку за предикатом:
public Student GetStudentByPredicate(Predicate<Student> match) {
return students.Find( match );
}