我刚开始使用 Redis,我正在将它用于我的个人项目之一。Redis DB 包含大约 10k 个对象
public Class FileList
{
public string FileName { get; set;}
public string FolderName { get; set;}
}
我ResultsView
最初在加载时在 ListBox 中显示此列表。我有一个TextBox
可以输入字符的地方,TextBoxChanged_Event
我正在调用一个函数,该函数将在 RedisDB 中查询FileList
包含我输入的字符的所有对象,并将其TextBox
存储在 a中,然后ResultsList<FileList>
在 a 中循环,foreach
然后添加到ListBox
.
开始显示结果至少需要一秒钟,而且速度不是很快。
现在,如果我对 a 执行相同的查询MasterList<FileList>
,那么它会快一点,但仍然不够快。
昨天,我尝试使用 RavenDb,它需要很长时间才能完成相同的任务。
是我将它添加Items
到ListBox
一个forach
花费了这么多时间的中还是有什么可以做的来加速它,就像ItemSource
我尝试过的那样但给了我错误ItemList should be empty before binding
我确实尝试了几乎类似问题的大多数答案,但没有一个对我有帮助。
代码
ResultsView.Items.Clear();
var redisClient = new RedisClient("localhost");
using (var client = redisClient.As<FileList>())
{
var foldersFromRedis = client.GetAll().Where(fileList => fileList.FileName.Contains(this.Search.Text.ToLower()));
foreach (FileList fileList in foldersFromRedis)
{
var listViewItem = new ListViewItem { Content = fileList.FileName , Tag = fileList.FolderName };
this.ResultsView.Items.Add(listViewItem);
}
}
//this.ResultsView.ItemsSource = ResultsFileList;
<ListBox Height="374" ScrollViewer.VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Left" Margin="10,0,0,0" Name="ResultsView" VerticalAlignment="Bottom" Width="405" BorderThickness="0" SelectionChanged="MovieNameSelectionChanged" FontFamily="Nobile" FontSize="13" Background="#A6FCFCFC" Foreground="Black" FontStretch="Normal">
<GridView>
<GridViewColumn Header="FileName" DisplayMemberBinding="{Binding FileName}"/>
</GridView>
</ListBox>
更新 1:
添加了 ViewCollectionSource 如下
private void ApplyViewCollectionSource()
{
_viewSource.Filter += ViewSourceFilter;
_viewSource.Source = _fileList = (List<FileList>)PopulateFileListEnglishWithReturn();
ResultsView.ItemsSource = _viewSource.View;
_timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
_timer.Tick += (o, e) =>
{
_timer.Stop();
_viewSource.View.Refresh();
};
Search.TextChanged += (o, e) => _timer.Start();
}
在构造函数中被调用。过滤器如下:
private void ViewSourceFilter(object sender, FilterEventArgs e)
{
var src = e.Item as FileList;
e.Accepted = src != null;
if (string.IsNullOrEmpty(Search.Text)) return;
var regex = new Regex(Search.Text, RegexOptions.IgnoreCase);
e.Accepted = regex.IsMatch(src.FileName);
}
这非常适合我的要求,但仅在文本框中的第三个字符之后。输入第一个字符后,ListBox
更新需要 2 秒,第二个字符需要 1 秒。在此之后,几乎是瞬间。主列表中大约有 5000 项_fileList
。
有什么方法可以提高前 2 个字符搜索的速度?