Здравствуйте, alex_public, Вы писали:
_>Так а где там область видимости этого самого "структурного типа"? В случае await оно вообще в куче создаётся и потом вызывается из цикла обработки сообщений или вообще другого потока. В случае yield я сам не проверял — у тебя есть точные данные, что оно размещается на стеке и при этом в области видимости вызывающего цикла? )
Сейчас — нет. Там генерируется reference type, и размещается в куче. Поэтому для агрессивной оптимизации нужен ещё и escape analysis. Всё опять упирается в инлайнинг, т.к. без него даже и со структурным типом не удалось бы сделать ничего полезного.
_>>>Ну есть обычное произвольное неотсортированное дерево и требуется найти количество узлов на кратчайшем пути между двумя заданными узлами.
S>>По-прежнему непонятно. Как устроено дерево? У каждого элемента есть указатель на parent?
_>Да простейшее дерево, типа такого:
_>_>struct node_t{
_> value_t value;
_> list<node_t> childs;
_>};
_>
И как выглядит сигнатура метода, который нужно написать?
Интуитивно ожидаемая int Distance(node_t &node1, node_1 &node2) нереализуема в такой архитектуре.
_>Ээээ что? Какое ещё SortedList? Зачем нам этот жирный тормоз? Смотри, вот буквально детская задачка из самых основ работы с коллекциями: имеем простейший int[], заполненный отсортированными значениями. Надо получить его подмассив, находящийся в пределах значений от 0 и до 1000. Я могу это сделать на linq за логарифмическое, а не линейное время?
Да, конечно. Но всё равно как-то придётся объяснить инфраструктуре, что массив отсортирован. Телепатия ведь не работает.
Если вы хотите иметь возможность стрелять себе в ногу в обычной "эгей!эгей!" манере нативных программистов, то достаточно сделать тонкую обёртку типа
public static SortedArray<t> AsSorted(this T[] alreadySortedArray)
where T:IComparable<T>
{
// skip sorting, just store the reference to the original array
_array = alreadySortedArray;
}
Далее — по тексту:
var test = new int[]{1, 6, 10, -150};
var splice = from a in test.AsSorted() where a >= 0 && a <1000 select a;