在.NET WinForms应用程序中为“业务对象”提供简单搜索功能的最佳方法是什么?
通过“简单搜索”,我的意思是像Vista + Windows 7的“搜索框”,它位于几乎每个窗口的右上角,搜索该窗口的内容(没有任何花哨,可能没有“高级”搜索 - 保持简单)。
“业务对象”是指基于“客户”和“地址”之类的对象的对象(主要是您简单的普通联系信息)。
我考虑过“滚动我自己的”简单搜索,也许让我的类实现一个“包含”功能,以便我可以询问每个对象是否“包含”任何用户的搜索词(然后以某种方式构建)基于匹配了多少单词的简单排名。
我也研究过Lucene.NET,但对我的需求似乎过于复杂 - 必须构建一个索引(并更新和维护它)。
连连呢?想法?
答案 0 :(得分:2)
我不知道“最好的”方式(如果我这样做,我会在谷歌工作)。尽管如此,我确实在几个月前在概念验证/客户演示中实现了类似的功能。请注意,我能够非常有效地约束问题域,尤其是可立即搜索的数据集的大小,因此性能不是问题。
我创建了FilterableListView
UserControl
。我在详细信息模式下使用了ListView
,我在其上方放置了TextBox
并使用平台互操作为其提供了一些CueText(类似“过滤器”或“搜索”)。然后我从后台线程更新了ListView
的内容(使用相当于SafeInvoke
的实现),如果自过滤器框中的上一个TextChanged
事件以来有0.5秒的延迟
我对ListView
中指定字段的内容做了一个简单的,不区分大小写的子字符串匹配,它快速,简单,有效。我发现Linq to Objects 非常非常有用。
我会为更多生产就绪的实施做得更好:
IFilterable
界面?答案 1 :(得分:0)
我会在每个类上实现一个简单的接口,它只返回描述实例的搜索项列表。然后,您就可以获取所有对象,询问他们的搜索字词,并根据用户提供的搜索字词对其进行排名。
这与您的Contains接口理念非常接近,但会保留更多业务类逻辑。您甚至可以通过反射检查对象,可能只是向属性添加一些用户属性,以便为搜索引擎提供一些提示,以便在搜索中包含哪些属性。
但请注意,您必须评估所有对象的每次搜索。如果使用复杂的排名函数,这将变得非常慢,超过大约一百个对象。使用反射会使事情变得更糟。
要解决的另一个问题是如何以有意义的方式处理搜索结果。如果您有很多不同的类,那么显示结果并将用户导航到应用程序中可以对该对象执行某些操作的位置可能是一项非繁琐的任务。
答案 2 :(得分:0)
我认为你在每个对象中使用“包含”方法的方法非常有用。
您可以向对象的成员提供“权重”,这样如果contains方法找到匹配项,请提供一种“分数”作为返回。
要考虑的其他事项是匹配是否完全匹配 ...并为该分数指定更多或更少的分数。
如果您搜索多种类型的对象...可能您可以将更高的值分配给主要对象(更多以业务为中心的对象),以便为它们提供更多优先级。
只是想一想......
答案 3 :(得分:0)
只要您没有太多的对象,只需循环遍历每个对象就可以完成您所描述的内容。您可以使用正则表达式而不仅仅包含Contains来为其提供更多灵活性。 Contains将为您提供对象的匹配,而不仅仅是对象内的属性的字符串值。匹配字符串可能对您更有用。
您可以做的一件事是在对象中创建一个方法,该方法只是您想要搜索的对象中所有字符串的串联字符串。然后应用正则表达式搜索从该方法得到的值。它很容易就不会成为性能最佳的解决方案,但它会快速而简单。就像我说的那样,只要你没有太多物体就可以了。