2012-03-13 15 views
1

ラムダ式でこれを行う方法はありますか?ラムダで条件を追加

responses.Add(sr).Where(v.Responses.TryGetValue(v.responseType, out sr)); 

典型的なif式の代わりにラムダ式または3項演算子を使用したいと考えています。

NB:

responsesList<string>タイプです。

v.Responses<enum ResponseType, string>

vDictionaryあるいくつかのオブジェクト

srが文字列です。

+0

'sr'が文字列の場合、' Dictionary 'に追加することはできません。 –

+3

質問は何ですか? – BrokenGlass

+0

申し訳ありませんが、今質問を編集しました。 –

答えて

2

されています:

string sr; 
if (v.Responses.TryGetValue(v.responseType, out sr)) 
    responses.Add(sr); 

構文を容易にし、同じ性能を得るための方法はありません。 しかし、あなた行うことができます:それは一種の愚かなので

responses.AddRange(v.Responses.Where(p => p.Key == v.responseType) 
           .Select(p => p.Value)); 

をあなたは...、最後の1が何をしているかを考えること

EDITをしたい場合がありますので、それは愚かである理由は、最後の式はに翻訳:

foreach(var pair in v.Responses) 
{ 
    if (pair.Key == v.responseType) 
     responses.Add(pair.Value); 
} 

だからあなたResponseType列挙が600万エントリを持っていた場合、プログラムは正しいエントリを見つけるために、キーのセット全体を反復処理するでしょう。あなたのケースでは、あなたはすでに鍵を知っているので、非常に高速であるので、v.Responses[key]を使用するべきです(どのような場合に辞書を使用する必要があるかを参照)。

+0

ありがとう、しかしあなたは精巧にできますか?なぜそれは愚かなのですか? –

+0

最後の文章を強調したいと思います。キーでO(1)アクセスを実行できるときに辞書全体を反復することは非常に効率的ではありません。 – digEmAll

+0

@digEmAllディクショナリが最大約4個のキーしか持てない場合は効率的でしょうか? –

1

LINQはコレクションを変更する予定はありません。

あなたは、単にこのような何かできませんでした:あなたが何をしたいか

string sr; 
    if(v.Responses.TryGetValue(v.responseType, out sr)) 
    responses.Add(sr); 
0

私はあなたの質問を正しく理解している場合、これはあなたが探していることを行うかもしれません。

あなたのサンプルコードに基づいて、私はあなたのオブジェクト "v"にRepsonseType型の "responseType"という名前のフィールドが含まれていると仮定しています。

var responses = v.Responses 
    .Where(r => r.Key == v.responseType) 
    .Select(r => r.Value) 
    .ToList(); 
関連する問題