代码之家  ›  专栏  ›  技术社区  ›  Keithius

在.NET WinForms应用程序中实现对“业务对象”的简单搜索的建议?

  •  1
  • Keithius  · 技术社区  · 15 年前

    在.NET WinForms应用程序中为“业务对象”提供简单搜索功能的最佳方法是什么?

    “简单搜索”是指Vista+Windows7的“搜索框”,它几乎位于每个窗口的右上角,可以搜索该窗口的内容(没有什么花哨之处,也可能没有“高级”搜索——保持简单)。

    我所说的“业务对象”是指基于类的对象,比如“客户机”和“地址”(主要是简单的工厂联系信息)。

    我考虑过“滚动我自己的”简单搜索,也许让我的类实现一个“包含”函数,这样我就可以询问每个对象是否“包含”用户的任何搜索词(然后根据匹配的单词数建立某种简单的排名)。

    我也研究过lucene.net,但对于我的需求来说,它似乎过于复杂——必须建立一个索引(并对其进行更新和维护)。

    建议?思想?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Community CDub    7 年前

    我不知道“最好”的方法(如果我知道的话,我会在谷歌工作)。不过,考虑到这一点,我确实在几个月前的概念验证/客户演示中实现了类似的功能。请注意,我能够非常有效地约束问题域,尤其是立即可搜索数据集的大小,这样性能就不是问题了。

    我创造了一个 FilterableListView UserControl . 我用过 ListView 在详细模式中,我删除了 TextBox 在它的正上方,使用平台interop CueText (类似于“过滤”或“搜索”)。然后我更新了 列表视图 从后台线程(使用与 SafeInvoke )如果从上一次到现在有0.5秒的延迟 TextChanged 来自筛选框的事件。

    我对 列表视图 它快速、简单、有效。我发现Linq to对象 非常 有用的。

    为了实现更适合生产的实现,我会做一些更好的事情:

    1. 在执行搜索之前,使用双击速度计算适当的延迟。
    2. 提供一个回调机制来执行搜索,而不是将其构建到控件中。也许有点像 IFilterable 接口?
        2
  •  0
  •   Daniel Brückner    15 年前

    我将在每个类上实现一个简单的接口,该接口只返回描述实例的搜索词列表。然后,您就可以获取所有对象,向他们索要搜索词,并根据用户提供的搜索词对其进行排名。

    这与您的包含接口思想很接近,但使更多的逻辑远离了业务类。您甚至可以通过反射来检查对象,并且可能只是向属性中添加一些用户属性,以向搜索引擎提供一些提示,说明要在搜索中包含哪些属性。

    但是请注意,您必须对所有对象的每次搜索进行评估。如果您使用一个复杂的排名函数,这个过程将变得非常缓慢,超过大约100个对象。使用反射会使事情变得更糟。

    另一个需要解决的问题是如何以有意义的方式处理搜索结果。如果您有很多不同的类,那么显示结果并将用户导航到应用程序中的某个位置(在该位置他可以对这些对象执行某些操作)可能是一项非常重要的任务。

        3
  •  0
  •   Romias    15 年前

    我认为在每个对象中使用“contains”方法的方法非常有用。

    你可以给“ 重量 对象的成员,以便如果contains方法找到匹配项,则 分数 “作为回报。

    另一个需要考虑的因素是是否匹配 是否完全匹配 …给那个分数加分或减分。

    如果在多个对象类型中搜索…也许你可以分配 较高值 为主要对象(更多以业务为中心的对象)提供更多优先级。

    只是想法…

        4
  •  0
  •       15 年前

    只要你没有太多的对象,做你正在描述的事情是有意义的,只要通过循环遍历每个对象。您可以使用正则表达式,而不是只使用contains,这样可以给它多一点灵活性。包含将为您提供对象上的匹配项,而不仅仅是对象内属性的字符串值。匹配字符串可能对您更有用。

    您可以做的一件事是在对象中创建一个方法,它只是一个由您要搜索的对象中的所有字符串组成的串联字符串。然后应用正则表达式搜索该方法的结果值。它很容易不会是性能最好的解决方案,但它将是快速和简单的。就像我说的,只要你没有太多的物品,就可以了。