2010-01-21 2 views
1

C# (3.5)로 목록을 필터링하는 가장 좋은 방법을 찾고 있지만 상황과 비슷한 예제를 찾지 못하는 것 같습니다. 나는 람다 (lambdas) 또는 린크 (linq)를 사용하고 있습니다.C# 일반 목록 - FindAll on 하위 배열

내가 찾은 대부분의 예제에 비해 독특한 것은, ... 내 목록 항목 각각의 예를 들어 아이의 배열을 가지고있다

var employees= new List<Employee> 
{ 
    new Employee{Name = "John",Nicknames="'J','Big J','Big John'"}, 
    new Employee{Name = "Joshua",Nicknames="'J','Josh','Joshman'"}, 
} 
내가 그 필터링하고 싶습니다

이 같은 목록 뭔가 ...

//using linq 
var matchesByNickname = 
from worker in employees 
where worker.Nicknames.Equals("J") 
select worker; 

//or lambda 
var employees2 = employees 
    .Where(e => Nicknames.Exists(n => n.Nickname == "J")) 

그러나

별명 자체 나는이 유형의 목록을 필터링하는 가장 좋은 방법이 될 것입니다 무엇 등 .Equals 또는 .Contains를 사용할 수없는 배열이기 때문에 당연히?

업데이트 : 내 사례를 단순하게 유지하려고 할 때 나는 너를 조금 잘못 이끌었다. 목록 항목에는 문자열이 아닌 실제 객체 배열이 있습니다. 내 실제 예는 사용자 정의 제품 객체 목록입니다. 제품 오브젝트에는 Region 오브젝트의 목록 인 Regions 특성이 있습니다. 제품에는 1 개 또는 1 개 이상의 영역이있을 수 있습니다. region 객체에는 이름과 ID가 있습니다. 그래서 제가 정말로 원하는 것은 특정 지역에 할당 된 제품에 대한 제품 목록을 필터링하는 것입니다.

+0

왜'Nicknames' 배열이나 목록을 만들 수 없습니다>? –

+1

'Nicknames'는 배열이 아니라 문자열이라는 것을 알 수 있습니다. –

답변

3

예제에서 Nickname은 내가 본 것처럼 배열이 아닙니다. 그것은 문자열입니다. 그것이 문자열의 배열입니다 당신이 할 수 가정하면 다음 경우 모두

var employees2 = employees.Where(e => e.Nicknames.Split(',') 
               .Contains("'" + name + "'")); 

:

var employees2 = employees.Where(e => e.Nicknames.Contains(name)); 

당신이 (문자열) 그대로를 유지하려면, 당신의 라인을 따라 뭔가를 시도 할 수 있습니다 WhereFindAll으로 대체하고 IEnumerable<T> (List<T>.FindAll은 2.0 이후 였으나 Enumerable.Where은 3.5에서 새로 추가됨) 대신 List<T>으로 결과를 가져올 수 있습니다. 물론

, 이상적으로, 당신은 그것을 다음과 같은 배열 또는 목록을 만들고 첫 번째 방법 사용합니다 :

var employees = new List<Employee> 
{ 
    new Employee{Name = "John",Nicknames= new [] {"J", "Big J", "Big John"}}, 
    new Employee{Name = "Joshua",Nicknames = new [] {"J", "Josh", "Joshman"}}, 
}; 

UPDATE을 : 당신의 실제 예제는이 샘플에서 많이 다르지 않다 케이스. 당신이 별명 주위에 작은 따옴표가있는 경우, 당신은 단지에

var filteredProducts = products 
     .Where(p => p.Regions.Any(r => r.Name == "regionToSearchFor")); 
+0

.Any를 사용하여 업데이트 된 답변이 완벽하게 작동했습니다! 감사 :-) –

0

엿볼 수 : 난 당신이 재산이 아니라 평등에 대한 전체 개체를 확인하기 때문에 당신이 Any 대신 Contains을 찾고 생각 작은 따옴표로 묶인 이름의 문자열.

employees.Where(x=>x.Nicknames.IndexOf("'J'") >= 0) 

편집 : 작은 따옴표를 잊어 버렸 ... 그리고 =