2013-03-12 3 views
0

어떤 이유로 든이 문제를 해결할 수는 없습니다. 목록에서 하나의 문자열을 포함하는 엔티티를 찾으십시오.

우리가 클래스 Foo

public class Foo 
{ 
    public string Name {get;set;} 
} 

이 우리가 그들의 일반적인 목록을 말한다. 일반 목록을 검색하고 문자열 목록에서 any를 포함하는 Name이있는 목록을 선택합니다.

그래서

var source = GetListOfFoos();//assume a collection of Foo objects 
var keywords = GetListOfKeyWords();//assume list/array of strings 
var temp = new List<Foo>(); 
foreach(var keyword in keywords) 
{ 
    temp.AddRange(source.Where(x => x.Name.Contains(keyword)); 
} 

같은이 문제는 여기에) 루프 (나에게 최적 느끼지 않는다)와 b) 각 개체가 두 번 이상 나타날 수 있습니다 (이름이 있다면 '롭 StackOverflow의'인 'Rob'이라는 키워드와 'Stackoverflow'라는 키워드가 있음).

나는 Distinct()이라고 부를 수는 있겠지만, 다시 한번 말하면 최적이라고 느끼지는 않습니다.

내가 잘못 접근하고 있다고 생각합니다. 내가 뭘 잘못하고있는 걸까요?


+0

그래서 간단하게 - 때때로 당신은 단지 지적 할 사람이 필요합니다 깜박이는 명백한 – glosrob

답변

2

나는 일반 목록을 검색 문자열 목록에서 하나를 포함 이름이 그 사람을 선택하고 싶다.

사운드 오히려 쉽게 : 당신이 일을하지 않을 수 있도록

var temp = query.ToList(); 
1

가 빠른 검색을위한 HashSet의에 키워드를 넣어 :

var query = source.Where(e => keywords.Any(k => e.Name.Contains(k))); 

이 같은 결과를 얻을 수 ToList() 추가 List<Foo> a N 루프.

HashSet<string> keywords = new HashSet<string>(GetListOfKeyWords(), StringComparer.InvariantCultureIgnoreCase); 

var query = source.Where(x => keywords.Contains(x.Name)); 

편집 : 사실, 나는 질문을 다시 읽어, 잘못이었다. 이름에 키워드가 포함되어 있는지 확인하지 않고 전체 키워드와 일치시킵니다. 더 나은 수정 작업.

나는 MarcinJuraszek의 답변을 좋아하지만, 나는 또한 당신이 키워드의 대소 문자를 구분하지 일치한다고 가정 것이다, 그래서 나는 이런 식으로 뭔가 시도를하려는 :

var query = source.Where(f => keywords.Any(k => f.Name.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0)); 
+0

키워드 콜렉션이 한 번 빌드 된 후 반복적으로 액세스되므로 양호한 호출입니다. –

+0

흠. 당신은 틀린 질문을 읽지 않았고 편집되었습니다. 원래 버전은 이름을 키워드와 일치 시켰습니다. :에스 –

관련 문제