【发布时间】:2010-10-21 11:15:27
【问题描述】:
我的用户类中有一个过滤器方法,它接收一个用户列表和一串搜索词。目前,FindAll 谓词拆分空格上的术语,然后如果任何可搜索属性包含术语的任何部分,则返回匹配项。
public static List<User> FilterBySearchTerms( List<User> usersToFilter, string searchTerms, bool searchEmailText )
{
return usersToFilter.FindAll( user =>
{
// Convert to lower case for better comparison, trim white space and then split on spaces to search for all terms
string[] terms = searchTerms.ToLower().Trim().Split( ' ' );
foreach ( string term in terms )
{
// TODO: Is this any quicker than two separate ifs?
if (
(searchEmailText && user.Email.ToLower().Contains( term ))
|| (
user.FirstName.ToLower().Contains( term ) || user.Surname.ToLower().Contains( term )
|| user.Position.ToLower().Contains( term ) || user.Company.ToLower().Contains( term )
|| user.Office.ToLower().Contains( term )
|| user.Title.ToLower().Contains( term )
)
)
return true;
// Search UserID by encoded UserInviteID
else
{
int encodedID;
if ( int.TryParse( term, out encodedID ) )
{
User fromInvite = GetByEncodedUserInviteID( encodedID );
if ( fromInvite != null && fromInvite.ID.HasValue && fromInvite.ID.Value == user.ID )
return true;
}
}
}
return false;
} );
}
我收到了一项新要求,因此订购现在很重要。例如,搜索“史密斯先生”时,亚当史密斯先生应该排在夏娃史密斯夫人之前,这可能使我对包含的使用不合适。但是,最重要的是属性/部分术语匹配的数量。
我想我可以有几个计数器来跟踪完整的术语匹配和部分匹配,然后按这两个排序。我也愿意接受有关如何改进 Filter 方法的建议——也许完全使用其他方法。
【问题讨论】: