Для Расширения решения для SQL счета, можно в основном сделать то же использование плоской антенной решетки. Далее больше, если Ваши строки, у всех есть та же длина и Ваше максимальное количество детей, известны (скажите в двоичном дереве), можно сделать это с помощью единственной строки (символьный массив). Если у Вас есть произвольное число детей, это усложняет вещи немного... Я должен был бы проверить свои старые примечания для наблюдения то, что может быть сделано.
Затем жертвуя небольшим количеством памяти, особенно если Ваше дерево редко и/или несбалансировано, Вы можете, с небольшим количеством индексной математики, доступ все строки случайным образом путем хранения дерева, ширина сначала в массиве как так (для двоичного дерева):
String[] nodeArray = [L0root, L1child1, L1child2, L2Child1, L2Child2, L2Child3, L2Child4] ...
эй знают Вашу длину строки, Вы знаете это
, я работаю теперь, так не может провести много времени на нем, но с интересом я могу выбрать немного кода, чтобы сделать это.
Мы используем, чтобы сделать это для поиска в двоичных деревьях, сделанных из кодонов DNA, процесс создал дерево, тогда мы сгладили его к шаблонам искомого текста и, когда найдено, хотя индексная математика (отворот сверху) мы возвращаем узел... очень быстрый и эффективный, жесткий, что наше дерево редко имело пустые узлы, но мы могли искать гигабайты данных в один миг.
Одна возможность:
String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";
- это возможность (при совпадении без учета регистра). Это немного беспорядок, и намеренно игнорирует случай, когда кавычки не используются. Чтобы представить его, не беспокоясь о побегах строк:
<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>
Это соответствует:
>
(т.е. возможные другие атрибуты) src
=
'
или "
>
(другие возможные атрибуты) >
, чтобы закрыть tag На заметку:
src =
, переместите открытую скобку дальше влево: Раньше я использовал нечто подобное для работы с настраиваемой прокруткой, и мы можем использовать это и здесь.
public static DependencyObject GetScrollViewer(DependencyObject o)
{
if (o is ScrollViewer)
{ return o; }
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
var child = VisualTreeHelper.GetChild(o, i);
var result = GetScrollViewer(child);
if (result == null)
{
continue;
}
else
{
return result;
}
}
return null;
}
Теперь нам просто нужно обработать событие SelectionChanged. Поскольку мы пытаемся прокрутить элемент в начало списка, лучший вариант - прокрутить вниз, а затем повторно прокрутить вверх до выбранного элемента. Как вы сказали, ScrollIntoView будет прокручиваться только до тех пор, пока элемент не станет видимым, и поэтому, как только выбранный элемент достигнет вершины, когда он прокручивается назад, он перестанет оставлять нас с нашим выбранным элементом в самом верху списка.
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
scrollViewer.ScrollToBottom();
uiListView.ScrollIntoView(e.AddedItems[0]);
}