Это вопрос о стиле и эффективности. У меня есть рабочее решение моей проблемы, но я ищу более приятное. У меня есть массив путей к файлам, и я хочу найти их общую родительскую папку. Если файлы не находятся в одной папке, я хочу создать исключение и закрыть приложение. Поэтому моя идея заключалась в использовании оператора LINQ SingeOrDefault. Этот оператор генерирует исключение, если последовательность содержит более одного элемента. Однако сообщение об исключении слишком общее, и я хочу добавить более описательное. Итак, я сделал следующее:
static string GetCommonParentDirectory(string[] filePaths)
{
try
{
return filePaths
.Select(p => Path.GetDirectoryName(p))
.Distinct(StringComparer.OrdinalIgnoreCase)
.SingleOrDefault();
}
catch (InvalidOperationException) // Sequence contains more than one element.
{
throw new ArgumentException(
"The files are not located in the same folder.");
}
}
Это работает, но некрасиво и основано на перехвате исключений, что неэффективно. Я бы предпочел реализацию без try/catch. Я подумываю об объединении операторов LINQ FirstOrDefault и SingleOrDefault, например:
static string GetCommonParentDirectory(string[] filePaths)
{
string commonDirectory = filePaths
.Select(p => Path.GetDirectoryName(p))
.Distinct(StringComparer.OrdinalIgnoreCase)
.FirstOrDefault(out bool isSingle);
if (!isSingle) throw new ArgumentException(
"The files are not all located in the same folder.");
return commonDirectory;
}
Мой вопрос: Как я могу реализовать перегрузку FirstOrDefault, включающую дополнительный выходной параметр bool isSingle?
В случае, если последовательность пуста, FirstOrDefault должен возвращать значение null (или значение по умолчанию в целом), а значение isSingle должно быть false. В противном случае FirstOrDefault должен возвращать первый элемент, а isSingle должен быть истинным только в том случае, если последовательность содержит ровно один элемент.
Приношу извинения, если этот вопрос задавался раньше. Я искал и не нашел.
Уточнение: Меня интересует оператор LINQ с такой подписью:
public static TSource FirstOrDefault(
this IEnumerable source, out bool isSingle)
Подробнее здесь: https://stackoverflow.com/questions/798 ... exceptions