2012-01-23 3 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のいずれかであるすべてのIDを返すには、カテゴリーAにあるIDを取得され、B

私は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

あなたは、最終的なコードスニペットは、すべてのIDを取得するには

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

する必要があります。すなわち、SelectMany方法は、このために完全である、x => searchCategories.All(c => x.Key.Contains(c))x => searchCategories.Contains(x.Key)を変更しようとすることができます

var ids = CategoryMapper.Mapping.SelectMany(kv => kv.Value); 
関連する問題