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

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

Сообщение Anonymous »

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

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

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

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

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

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