LINQ SingleOrDefault, но без исключенийC#

Место общения программистов C#
Ответить
Anonymous
 LINQ SingleOrDefault, но без исключений

Сообщение Anonymous »

Это вопрос о стиле и эффективности. У меня есть рабочее решение моей проблемы, но я ищу более приятное. У меня есть массив путей к файлам, и я хочу найти их общую родительскую папку. Если файлы не находятся в одной папке, я хочу создать исключение и закрыть приложение. Поэтому моя идея заключалась в использовании оператора 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 должен быть истинным только в том случае, если последовательность содержит ровно один элемент.
Приношу извинения, если этот вопрос задавался раньше. Я искал и не нашел.

Подробнее здесь: https://stackoverflow.com/questions/798 ... exceptions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»