나는 사용자 목록에 사용자 및 검색 문자열 문자열을 취하는 필터 메소드가 있습니다. 현재 FindAll 술어는 공백에 용어를 나눈 다음 검색 가능한 속성 중 하나라도 용어의 일부가 포함되어 있으면 일치를 반환합니다.C#의 검색어로 필터링 한 후 일치 항목 수를 기준으로 목록을 정렬하려면 어떻게해야합니까?
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;
});
}
이제 주문이 중요해질 수 있도록 새로운 요구 사항을 받았습니다. 예를 들어, 'Mr Smith'를 검색하면 부인 인 이브 스미스 (Eve Smith) 앞에서 미스터 아담 스미스 (Adam Smith)가 있어야합니다. 그러나 가장 중요한 것은 속성의 수/용어 매치의 일부입니다.
저는 완전한 용어 일치와 부분 일치를 추적하기위한 몇 가지 카운터를 가질 수 있다고 생각합니다. 그런 다음 그 둘로 주문하십시오. Filter 메서드를 개선 할 수있는 방법에 대한 제안도 열려 있습니다. 아마도 다른 것을 사용했을 것입니다.
영문자 우선 순위를 유지하기 위해 orderby matchCount 뒤에 사용자 이름에 대한 보조 orderby를 추가 하시겠습니까? –
아마도, 그것이 원한다면. 모든 종류의 옵션이 있습니다 :) –
안녕하세요 존, 답장을 보내 주셔서 감사합니다. 귀하의 코드에서 몇 가지 오류가 발생했습니다. 1. System.Linq.Enumerable.Count (System.Collections.Generic.IEnumerable , System.Func ) 메서드의 형식 인수를 사용에서 유추 할 수 없습니다. 형식 인수를 명시 적으로 지정하십시오. 2. 이름 'term'이 현재 컨텍스트에 존재하지 않습니다. Linq를 사용하기 전에 사용하지 않은 것 같습니다. 정확히 어떻게 작동하는지 모르겠습니다 ... –
Rich