Поскольку Max () требует хотя бы один элемент в своей последовательности, вы должны либо
- перехватить исключение и установить максимальное значение в ноль
- проверьте длину перед вызовом Max (). Я бы порекомендовал это
Хотя можно написать логику в одном длинном выражении запроса, я бы порекомендовал немного разбить его, чтобы улучшить читаемость. Создайте метод, который возвращает целочисленную часть имени дочернего элемента управления:
private int NumberFromElementName(string name)
{
// Or search for the last '_' using name.LastIndexOf()
var numString = name.Substring("Control_".Length);
return Int32.Parse(numString);
}
Затем выполните запрос в два шага, чтобы увидеть длину возвращаемой последовательности. Заметьте, я конвертирую его в массив, чтобы избежать необходимости дважды выполнять запрос. Я также использую метод расширения OfType , чтобы он работал, даже если у холста есть дочерний элемент, который не относится к типу FrameworkElement.
var children = canvas1.Children.OfType<FrameworkElement>().ToArray();
int max = 0;
if (children.Length > 0)
max = children.Max(x => NumberFromElementName(x.Name));
string nextChildName = String.Format ("Control_{0}", max + 1);
РЕДАКТИРОВАТЬ: Как указал @Jan в своем ответе, вы можете избежать разделения запроса на две части, используя DefaultIfEmpty перед вызовом Max в запросе.