По вашей реализации:
1) Конструкцию типа list.Count() == 0
можно заменить спокойно вызовом list.Any()
2) Почему возвращается 0, когда в коллекции нету элементов? Разве это не исключительная ситуация? Может стоит бросать ошибку?
3) Правильно ли я понимаю, что в этой строчке опечатка: int subMax = count(list.Skip(1));
. Предполагаю, что вместо вызова метода count() должен вызываться метод Max()?
4) Ваш алгоритм неправильно отработает для случая, когда коллекция содержит только один элемент.
5) Постоянные вызовы list.ToArray()
создают лишние объекты в памяти, используйте просто list.ElementAt(index)
для получения нужного элемента в коллекции с указанным индексом.
По поводу реализации из книги: в целом, большой разницы между вашей реализации и реализацией из книги я не вижу, т.к. они используют один и тот же принцип рекурсивности. По факту, вы просто заменили тернарный оператор на if и зачем-то убрали остальные проверки. В этом плане алгоритм из книги лучше, т.к. он, во-первых он выбрасывает исключение для пустой коллекции, а во-вторых он правильно отрабатывает для коллекции, состоящей только из одного или двух элементов. Единственное только что меня смущает, так это постоянные вызовы First()
, Skip()
, Take()
. Как по мне, было бы лучше загнать результаты вызовов этих методов единожды в одну переменную и работать уже непосредственно с этой переменной