Действительно ли возможно обработать исключения в запросах LINQ?

Мне не ясно, как это сделает то, что Вы хотите. Рассмотрите этот trival 3D случай:

001 ------ 101
 |\         |\
 | \        | \
 |  011 ------ 111
 |   |      |   |
 |   |      |   |
000 -|---- 100  |
  \  |       \  |
   \ |        \ |
    010 ------ 110

, который может быть "Hilbertized" следующим путем:

001 -----> 101
  \          \
   \          \
    011        111
     ^          |
     |          |
000  |     100  |
  \  |       \  |
   \ |        \ V
    010        110

в 1D порядок:

000 -> 010 -> 011 -> 001 -> 101 -> 111 -> 110 -> 100

Вот противный бит. Рассмотрите список пар и 1D расстояния ниже:

000 : 100 -> 7
010 : 110 -> 5
011 : 111 -> 3
001 : 101 -> 1

Во всех случаях, лево-и правые значения являются тем же 3D расстоянием друг от друга (+/-1 в первом положении), которые, кажется, подразумевают подобную "пространственную местность". Но линеаризуя любым выбором размерного упорядочивания (y, затем z, затем z, в вышеупомянутом примере) повреждения та местность.

Другой способ сказать это - то, что взятие начальной точки и упорядочивание остающихся точек их расстоянием от той начальной точки обеспечат существенно отличающиеся результаты. Взятие 000 как запуск, например:

1D ordering : distance    3D ordering : distance
----------------------    ----------------------
        010 : 1           001,010,100 : 1
                          011,101,110 : sqrt(2)
                              111     : sqrt(3)
        011 : 2
        001 : 3
        101 : 4
        111 : 5
        110 : 6
        100 : 7

Этот эффект растет экспоненциально с количеством размеров (предполагающий, что каждый размер имеет тот же "размер").

35
задан Jader Dias 18 August 2009 в 14:29
поделиться

3 ответа

myEnumerable.Select(a => 
  {
    try
    {
      return ThisMethodMayThrowExceptions(a));
    }
    catch(Exception)
    {
      return defaultValue;
    }
  });

Но на самом деле он имеет какой-то запах.

О синтаксисе лямбда:

x => x.something

является своего рода сокращением и может быть записано как

(x) => { return x.something; }
39
ответ дан 27 November 2019 в 06:55
поделиться

Вызовите проекцию, в которой есть эта попытка / улов:

myEnumerable.Select(a => TryThisMethod(a));

...

public static Bar TryThisMethod(Foo a)
{
     try
     {
         return ThisMethodMayThrowExceptions(a);
     }
     catch(BarNotFoundException)
     {
         return Bar.Default;
     }
}

По общему признанию, я редко хотел бы использовать эту технику. В целом это похоже на злоупотребление исключениями, но иногда есть API, которые не оставляют вам выбора.

(Я бы почти наверняка поместил его в отдельный метод, а не помещал бы его "встроенным" в качестве лямбда-выражения.)

18
ответ дан 27 November 2019 в 06:55
поделиться

При работе с LINQ вы ' Я обычно найду сценарии, в которых ваше выражение может вызвать нежелательные побочные эффекты. Как сказал Джон, лучший способ справиться с такого рода проблемами - иметь служебные методы, которые может использовать ваше выражение LINQ, которые будут обрабатывать их изящно и таким образом, чтобы не взорвать ваш код. Например, у меня есть метод, который мне время от времени приходилось использовать, который обертывает TryParse, чтобы сообщить мне, является ли что-то числом. Конечно, есть много других примеров.

Одно из ограничений синтаксиса выражения состоит в том, что есть много вещей, которые он не может сделать ни изящно, ни вообще без временного прерывания выполнения выражения для обработки заданного сценарий. Прекрасный пример - анализ подмножества элементов в XML-файле. Попробуйте разобрать сложную родительскую коллекцию с дочерними подмножествами из файла XML в одном выражении, и вы

2
ответ дан 27 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: