2012-01-23 5 views
1

나는이 같은 Dictionary<string, IList<ID>>에 LINQ를 사용 :Linq로 중첩 목록을 필터링하는 방법은 무엇입니까?

var searchCategories = new List {"A", "B", "C"}; 
Result = CategoryMapper.Mapping.Where(
     x => searchCategories.Contains(x.Key)). 
     Select(x => new Tuple<string, IList<ID>>(x.Key, x.Value)).ToList(); 

이 어느 카테고리 A에서 B 또는 C 그러나 내가하고 싶은 것이 카테고리 A, B에 ID를 검색 할 것입니다 모든 ID를 반환 및 C.

난 Linq이 작업을 수행하는 방법을 알아내는 데 어려움이 있습니다.

UPDATE

미안하지만 난 내 초기 게시물에 좀 더 많은 정보를 추가해야합니다.

A : 내 사전에 목록 (나는 단지 그것을 간단하게 여기 번호를 사용)과 같은 다소 보면 {1, 2, 3}
B : {1,3}
C : {3}

그래서 모든 검색어가있는 유일한 숫자이기 때문에이 쿼리의 결과는 '3'이됩니다.

+0

질문을 잘못 읽었을 때 게시하여 답변하고 삭제했습니다. 혼란에 대해 죄송합니다. 무시하세요. – kkm

답변

1

는 것 같은데 당신은 모든 목록의 교차점을 취하고 있습니다. 그것은 얻는 것이 간단해야합니다.

var searchCategories = new HashSet<string> { "A", "B", "C" }; 
var result = CategoryMapper.Mapping 
    .Where(map => searchCategories.Contains(map.Key)) 
    .Select(map => map.Value as IEnumerable<ID>) 
    .Aggregate((acc, cur) => acc.Intersect(cur)); 

당신의 ID 유형이 IEquatable<ID> 인터페이스를 구현하지 않는 경우, 당신은 비교를 수행하기 위해 (나는 당신이 생각하는 것이)는 같음 비교를 제공해야 할 수도 있습니다.

....Aggregate((acc, cur) => acc.Intersect(cur, new YourIdEqualityComparer())); 
0

당신은

var searchCategories = new List<string> {"A", "B", "C"}; 
Result = CategoryMapper.Mapping.Where(
    x => searchCategories.All(c => x.Key.Contains(c))). 
    Select(x => new Tuple<string, IList<ID>>(x.Key, x.Value)).ToList(); 
0

모든 ID를 얻으려면해야 최종 코드, 즉 x => searchCategories.All(c => x.Key.Contains(c))x => searchCategories.Contains(x.Key)을 변경하려고 할 수 있으며, SelectMany 방법이 최적입니다 :

var ids = CategoryMapper.Mapping.SelectMany(kv => kv.Value); 
관련 문제