相关疑难解决方法(0)

搜索字符串集合的最快方法

问题:

我有一个大约120,000个用户(字符串)的文本文件,我想将其存储在一个集合中,然后再对该集合执行搜索.

每次用户更改a的文本时都会发生搜索方法TextBox,结果应该是包含文本的字符串TextBox.

我不必更改列表,只需将结果拉出来并将其放入ListBox.

到目前为止我尝试过的:

我尝试了两个不同的集合/容器,我正在从外部文本文件中转储字符串条目(当然是一次):

  1. List<string> allUsers;
  2. HashSet<string> allUsers;

使用以下LINQ查询:

allUsers.Where(item => item.Contains(textBox_search.Text)).ToList();

我的搜索事件(用户更改搜索文本时触发):

private void textBox_search_TextChanged(object sender, EventArgs e)
{
    if (textBox_search.Text.Length > 2)
    {
        listBox_choices.DataSource = allUsers.Where(item => item.Contains(textBox_search.Text)).ToList();
    }
    else
    {
        listBox_choices.DataSource = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

两者都给了我一个很差的响应时间(每次按键之间大约1-3秒).

题:

你认为我的瓶颈在哪里?我用过的系列?搜索方法?都?

如何获得更好的性能和更流畅的功能?

c# linq collections string-search winforms

79
推荐指数
10
解决办法
2万
查看次数

为什么SortedSet <T> .GetViewBetween不是O(log N)?

在.NET 4.0+中,类SortedSet<T>有一个名为的方法GetViewBetween(l, r),它返回树部件上的接口视图,其中包含指定的两个之间的所有值.鉴于它SortedSet<T>是作为红黑树实现的,我自然希望它能够及时运行O(log N).C++中的类似方法是std::set::lower_bound/upper_boundJava TreeSet.headSet/tailSet,它们是对数的.

然而,事实并非如此.以下代码在32秒内运行,而等效O(log N)版本GetViewBetween将使该代码在1-2秒内运行.

var s = new SortedSet<int>();
int n = 100000;
var rand = new Random(1000000007);
int sum = 0;
for (int i = 0; i < n; ++i) {
    s.Add(rand.Next());
    if (rand.Next() % 2 == 0) {
        int l = rand.Next(int.MaxValue / 2 - 10);
        int r = l + rand.Next(int.MaxValue / 2 - 10);
        var t = s.GetViewBetween(l, …
Run Code Online (Sandbox Code Playgroud)

.net c# complexity-theory sortedset

65
推荐指数
2
解决办法
4401
查看次数

代表树木的物体

C#(或.net)中是否有代表二叉树(或好奇心)和n-ary树的对象?

我不是在谈论表示树控件,而是作为模型对象.

如果没有,是否有任何良好的外部实现?

.net c# tree binary-tree

21
推荐指数
3
解决办法
2万
查看次数