Мне не ясно, как это сделает то, что Вы хотите. Рассмотрите этот 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
Этот эффект растет экспоненциально с количеством размеров (предполагающий, что каждый размер имеет тот же "размер").
myEnumerable.Select(a =>
{
try
{
return ThisMethodMayThrowExceptions(a));
}
catch(Exception)
{
return defaultValue;
}
});
Но на самом деле он имеет какой-то запах.
О синтаксисе лямбда:
x => x.something
является своего рода сокращением и может быть записано как
(x) => { return x.something; }
Вызовите проекцию, в которой есть эта попытка / улов:
myEnumerable.Select(a => TryThisMethod(a));
...
public static Bar TryThisMethod(Foo a)
{
try
{
return ThisMethodMayThrowExceptions(a);
}
catch(BarNotFoundException)
{
return Bar.Default;
}
}
По общему признанию, я редко хотел бы использовать эту технику. В целом это похоже на злоупотребление исключениями, но иногда есть API, которые не оставляют вам выбора.
(Я бы почти наверняка поместил его в отдельный метод, а не помещал бы его "встроенным" в качестве лямбда-выражения.)
При работе с LINQ вы ' Я обычно найду сценарии, в которых ваше выражение может вызвать нежелательные побочные эффекты. Как сказал Джон, лучший способ справиться с такого рода проблемами - иметь служебные методы, которые может использовать ваше выражение LINQ, которые будут обрабатывать их изящно и таким образом, чтобы не взорвать ваш код. Например, у меня есть метод, который мне время от времени приходилось использовать, который обертывает TryParse, чтобы сообщить мне, является ли что-то числом. Конечно, есть много других примеров.
Одно из ограничений синтаксиса выражения состоит в том, что есть много вещей, которые он не может сделать ни изящно, ни вообще без временного прерывания выполнения выражения для обработки заданного сценарий. Прекрасный пример - анализ подмножества элементов в XML-файле. Попробуйте разобрать сложную родительскую коллекцию с дочерними подмножествами из файла XML в одном выражении, и вы