2009-02-26 23 views
3

でのforeachの交換:は、私は私の方法の一つで、次のコードを持ってLINQクエリ

foreach (var s in vars) 
{ 
    foreach (var type in statusList) 
    { 
     if (type.Id == s) 
     { 
      Add(new NameValuePair(type.Id, type.Text)); 
      break; 
     } 
    } 
} 

これは一種の無効私には思える、との少なくとも一つを置換する方法があった場合、私は思っていましたLINQクエリでforeach。助言がありますか?

EDIT: varsは文字列の配列で、AddメソッドはCSLA NameValueListに項目を追加します。このような

答えて

6

EDIT:私はbreak;

関連IDを持つ複数のタイプがあることができれば前に、あなたは以下のKeith's answerや私の2番目のコードサンプルあたりとしてFirstOrDefaultを使用する必要が気づいていませんでした。

EDIT:それはtype.Idのタイプにかかわらず平等のために/ハッシュコードの動作を想定して、不必要に非効率的だとして、バージョン「マルチから」削除。

A・ジョインは、しかし、おそらく、より適切です:

var query = from s in vars 
      join type in statusList on s equals type.Id 
      select new NameValuePair(type.Id, type.Text); 

foreach (var pair in query) 
{ 
    Add(pair); 
} 

あなたはあなただけのAddRange(query)を呼び出すことができ、その時点でIEnumerable<NameValuePair>を取るAddRange方法を作りたいかもしれません。

また、ルックアップを使用することもできます。このバージョンでは、 "s"ごとに1つのタイプしか追加しないようにしています。

var lookup = types.ToLookup(type => type.Id); 
foreach (var s in vars) 
{ 
    var types = lookup[s]; 
    if (types != null) 
    { 
     var type = types.First(); // Guaranteed to be at least one entry 
     Add(new NameValuePair(type.Id, type.Text)); 
    } 
} 

これは、基本的に辞書を構築するためにタイプのリストを調べるという利点があります。

+0

ブレークは最初の一致を意味します。 'type.Id = s'の場合​​、解は内側の列挙可能なすべてのケースに一致します。 – leppie

+0

それで "あれがあれば..."という文章:) –

+0

同じ答えを投稿する前にスクロールダウンしてください:)今日のレッスン:もっと慎重に読んでください。 – leppie

2

何か:

foreach(var s in vars) { 
    var type = statusList.FirstOrDefault(t => t.Id == s); 
    if (type != null) 
     Add(new NameValuePair(type.Id, type.Text)); 
} 

それともVARSはForEachメソッドをサポートしている場合、これはあまりにも動作します(ただし、私はoverLINQifyingに対してお勧めします):

vars.ForEach(s => { 
    var type = statusList.FirstOrDefault(t => t.Id == s); 
    if (type != null) 
     Add(new NameValuePair(type.Id, type.Text)); 
}); 

私はtypeを参照のインスタンスであると仮定しましたタイプ。基本的には

+0

あまりにも私を倒しますそれは:-) –

+0

私はどのようにコンパイルするか分かりません。変数がどこにも宣言されていないので、3行目の "type"の使用はうまくいきません。 "Any"コールのラムダ式は保持されません。 –

+0

ジョン、気づいてくれてありがとう!私はその馬鹿げたミスをどうやって作ったのか、まだ疑問に思っています。 –

12

var types = 
    from s in vars 
    let type = (
     from tp in statusList 
     where tp.Id == s).FirstOrDefault() 
    where type != null 
    select new NameValuePair(type.Id, type.Text) 
+1

+1は "s"ごとに1つのタイプしか追加しないことに注意してください:) –

1

Bart de SmetはIEnumerableをするための拡張のForEachの実装を持っています。

2

あなたのAddメソッドは、リストを構築している場合、あなたも試してみてください:

IEnumarable<NamedValuePair> result = statusList.Where(type => type.Id == s).Select(new NameValuePair(type => type.Id, type.Text)); 
1

私はので、ここで1だ、グループに参加すると答えが表示されない:

関連する問題