2011-02-01 7 views
0

これはラムダ式を使って書き直すことができます。しかし、私はそれを把握することはできません。ラムダを使ってどのように書かなければならないかについての意見は誰にもあります。このよう2つのオブジェクトを持つラムダ式

  foreach (var _systemItem in _systemData) 
      { 
       foreach (var _institutionItem in _institutionData) 
       { 
        if (_systemItem.LookupValue == _institutionItem.OriginalSystemLookupValue) 
        { 
         _values.Add(new LookupValue() 
         { 
          DisplayText = _institutionItem.LookupText, 
          Value = _institutionItem.LookupValue 
         }); 
        } 
        else 
        { 
         _values.Add(new LookupValue() 
         { 
          DisplayText = _systemItem.LookupText, 
          Value = _systemItem.LookupValue 
         }); 
        } 
       } 
      } 
+0

あなたのコードは基本的に、システムリストと機関リストの外積を含む値リストを作成しています。したがって、_systemDataに5つの要素が含まれ、_institutionDataに10の要素が含まれている場合、_valuesリストは50の要素になります。それは本当にあなたが望むものですか? –

+0

いいえ私は全部の50州を含む州のシステムリストを持っていて、そして、たとえば機関がアラスカがすべての大文字のアルファベットで綴られていると言いたいと思うなら、 ALASKAをAlaksaの代わりにしたいと思っています。だから私たちはまだ50のアイテムを持っていますが、1つはもう一方を置き換えます。私は元の値を格納しているデータベースにフィールドを持っています。そのフィールドには、比較が行われています。一致するものがある場合は、システムではなく機関があります。 – gevjen

答えて

0

確かに、私は意見があります。私はこのようにそれを記述します

var pairs = _systemData.SelectMany(s => 
    _institutionData.Select(i => new { System = s, Institution = i })); 

_values.AddRange(pairs.Select(x => 
{ 
    bool match = x.System.LookupValue == x.Insitution.OriginalSystemLookupValue; 

    return match ? new LookupValue(x.Institution) : new LookupValue(x.System); 
})); 

そしてInstitutionまたはSystemを取る本当のコンストラクタにLookupValueのオブジェクト初期化子を移動します。

+0

これは少し修正した後に完全に機能しました。助けてくれてありがとう。 – gevjen

4

values.AddRange(from s in _systemData 
       from i in institutionData 
       select s.LookupValue == i.OriginalSystemLookupValue ? 
        new LookupValue { 
         DisplayText = _institutionItem.LookupText, 
         Value = _institutionItem.LookupValue 
        } 
       : new LookupValue { 
         DisplayText = _systemItem.LookupText, 
         Value = _systemItem.LookupValue 
        } 
       ); 
3

が空であるList<LookupValue>を開始する_valuesですか?もしそうなら、その外観は次のようになります。_systemItem_institutionItemが同じ型であることを前提としてい

_values = (from x in _systemData 
      from y in _institutionData 
      let item = x.LookupValue == y.OriginalSystemLookupValue ? x : y 
      select new LookupValue { DisplayText = item.LookupText, 
            Value = item.LookupValue }) 
      .ToList(); 

を。関係のない型の場合は、LookupTextLookupValue(またはさらにToLookupValueメソッド)を定義する共通のインターフェイスを与え、条件演算子のオペランドの1つをインターフェイスにキャストすることができます。例:

_values = (from x in _systemData 
      from y in _institutionData 
      let item = x.LookupValue == y.OriginalSystemLookupValue 
         ? (ILookupSource) x : y 
      select item.ToLookupValue()) 
      .ToList(); 
+1

私はそれらが同じタイプであるとは思わないでしょう。 – SLaks

+1

私は同意する、それはそう思わない。それはあまりにも意味をなさないでしょう。 – mquander

+0

@SLaks:私は言及するように編集していました:)もし彼らが同じタイプでないなら、私はそれがインターフェイスに共通しているものをカプセル化する価値があると思います。 –

関連する問題