Согласен с Петр.ом
Отмечу один момент. Вы часто в вашем вопрос проверяете не пусто ли перечисление с помощью
if (lst.Count() > 0)
{
...
}
в этом случае LINQ реально подсчитывает количество элементов, т.е. пробегает по всем элементам перечисления, хотя достаточно узнать: есть ли в перечисление хотя бы один:
if (lst.Any())
{
...
}
В данном случае это не нужно, но мало ли когда понадобится эффективно проверить перечисление на пустоту...
var first = lst.First(x => x.ID == 3); - если вы уверены, что у вас точно есть искомый элемент в массиве (при отсутствии элемента будет ошибка выполнения) var first = lst.FirstOrDefault(x => x.ID == 3); - при отсутствии элемента вернет null
И First и FirstOrDefault выполняются сразу, т.е. результат или ошибка будут получены сразу после вызова оператора.