2016-06-02 9 views
1

linq文を使用して2つのリストからデータをフィルタリングしてdicを作成する方法を探しています。たとえば:{<1, <apple,1>>, <3, <peach, 3>>}LINQで2つのリストをフィルタリングしてdicを作成する

「2」はLINQ文を使用してスキップされなければならないが、私はこれを知っていけない:?

list1: { 1, 2, 3 } 
list2: {<apple,1>, <peach, 3>} 

最終辞書を問わず、これを見なければなりませんか

linqを使用してこの問題を解決する方法を教えてください。おかげ

+0

をあなたはLINQなしでそれを行うだろうか? Linqベースのソリューションを手に入れることができます。ただ試してみてください。 – HimBromBeere

+1

list2はすでに辞書のように見えます: apple、key - > 1>あなたのモデルにもっと情報を提供する必要があります、おそらくもっと複雑です... – Soren

+0

@Sorenリンゴ、1)<> –

答えて

1

したい場合は、SelectManyを使用することができます。

var result = (from l1 in list1 
       from l2 in list2 
       where l1 == l2.Id 
       select new 
       { 
        Id = l1, 
        Name = l2.Name 
       }).ToDictionary(k=>k.Id, v=>v.Name); 
+1

@HimBromBeereこれはSelectManyのlinqの 'query'構文です –

+1

おかげで、これはクールで、後で読む/保守が容易です –

5

Joinリストとfiddle

+0

の代わりにこれは最善の答えです!!! – Soren

0

であなたは辞書を生成するために、一つに二つのリストをマージするEnumerable.Zipを使用して、Enumerable.ToDictionaryことができるかどうか試してください辞書

var d = list1.Join(list2, i=>i, o=>o.Id, (i,o)=>o) 
      .ToDictionary(o=>o.Id); 

につながる置きます。

ような何か:

var result = list1.Zip(list2, (l, r) => Tuple.Create(l, r)) 
        .ToDictionary(v => v.Item1, v => v.Item2); 
+0

list1とリストの長さが同じでないとどうなりますか? – qxg

+0

ここでフィルターはどこですか? –

+0

@qxg最初のリストの最後に停止します。短いリストが使い果たされたときに、デフォルトの要素に入れる 'ZipLong'を作成するのが難しくありません。 – Richard

関連する問題