Estoy escribiendo un Intellisense/Autocomplete como el que encuentras en Visual Studio. Todo está bien hasta cuando la lista contiene probablemente más de 2000 elementos.¿Cuál es la manera más rápida de filtrar una lista de cadenas al hacer una lista de Intellisense/Autocomplete?
estoy usando una declaración de LINQ simple para hacer el filtrado:
var filterCollection = from s in listCollection
where s.FilterValue.IndexOf(currentWord,
StringComparison.OrdinalIgnoreCase) >= 0
orderby s.FilterValue
select s;
entonces asignar esta colección para ItemSource de un cuadro de lista de WPF, y ese es el final de la misma, funciona bien.
Teniendo eso en cuenta, el Listbox también se virtualiza también, por lo que solo habrá como máximo de 7 a 8 elementos visuales en la memoria y en el árbol visual.
Sin embargo, la advertencia ahora es que, cuando el usuario escribe extremadamente rápido en el richtextbox, y en cada tecla ejecuto el filtrado + enlace, existe esta condición de semirreproducción, o filtrado fuera de sincronización, como el primero El filtrado de los trazos clave todavía podría estar haciendo su trabajo de filtrado o enlace, mientras que el cuarto trazo clave también está haciendo lo mismo.
Sé que podría demorarme un poco antes de aplicar el filtro, pero estoy tratando de lograr un filtrado perfecto como el de Visual Studio.
No estoy seguro de dónde se encuentra exactamente mi problema, así que también lo estoy atribuyendo al funcionamiento de cadena de IndexOf, o tal vez mi lista de cadenas podría optimizarse en algún tipo de índice, lo que podría acelerar la búsqueda.
Cualquier sugerencia de ejemplos de código es muy bienvenida.
Gracias.
¿Ha verificado que este es, de hecho, el cuello de botella? Solo tengo curiosidad por saber si hay otro código que pueda estar contribuyendo y, sin crear perfiles, no puede estar seguro de dónde está el cuello de botella. +1 por cierto, me encantan las preguntas como esta. –
Hola Andrew, me alegro de haber hecho una pregunta esclarecedora :). Es solo una suposición, me refiero a filtrar o vincular al control que es el cuello de botella. Tampoco estoy del todo seguro de si realmente puede tener una función Intellisense/Autocomplete list que sea extremadamente eficiente con tantos elementos y en crecimiento. No soy exactamente bueno con el uso de herramientas de creación de perfiles, ¿tiene alguna buena recomendación sobre cómo puedo perfilar esto? He intentado el estudio visual interno, sin embargo, el gráfico bonito apunta a Application.Run ... = ( –
¿Estás seguro de que el ListBox está virtualizado correctamente, ya que este código de filtro real debería ejecutarse en alrededor de un milisegundo? –