2017-10-31 3 views
-2

ObjAListのObjA ID1とID2がObjBListのObJB ID1とID2と一致する場合にのみ、MainObjListをクエリしてDoSomething()を呼び出す必要があります。このシナリオでLinqクエリを書く方法

foreach (MainObj mainObj in MainObjList) 
{ 
    IEnumerable<ObjA> objAMatches = mainObj.ObjAList 
     .Join(mainObj.ObjBList, 
      objA => (objA.ID1, objA.ID2), 
      objB => (objB.ID1, objB.ID2), 
      (a, b) => a); 

    foreach (ObjA objA in objAMatches) 
    { 
     objA.DoSomething(); 
    } 
} 
+2

[OK]を、あなたはこれまでに何をやったか私たちを見ることができますか?あなたのコードはどこですか? – Marusyk

+1

実際のコードを表示してください - あなたが示したコードでは 'ObjB'は使われていません。 – Enigmativity

+0

@Enigmativity申し訳ありませんが、私はタイプミスがありました。私はそれを訂正した。 – Sami

答えて

1

リストに参加してSelectManyを介してコレクションにそれらを結合するようにしてください:

MainObjList.SelectMany(x => x.ObjAList.Join(x.ObjBList, 
         a => new { a.ID1, a.ID2 }, 
         b => new { b.ID1, b.ID2 }, 
         (a, b) => a)) 
      .ToList() 
      .ForEach(x => x.DoSomething()); 
+0

あなたの 'publicリスト MainObjList {get;セット; } ' –

+0

私はこのワンライナーが好きですが、デバッグの目的でラムダの外側にDoSomething()を置く方が良いでしょう。 – CalC

+0

@ Cal279私は同意します –

1

私は、以下が動作するはずと信じています。 両方のエンティティをjoinにしてIDを比較する必要があります。

var mainObj = new MainObj(); //// Init your object and fill it with data 

var equals = from objA in mainObj.ObjAList 
     join objB in mainObj.ObjBList on new { objA.ID1, objA.ID2 } equals new { objB.ID1, objB.ID2 } 
     select objA; 

foreach(var entry in equals) 
{ 
    entry.DoSomething(); 
} 
0

あなたはLINQ - 式を試すことができます:ネストされたforeachを持つことが理想的ではないが

public List<MainObj> MainObjList { get; set; } 


public class MainObj 
    { 
     public List<ObjA> ObjAList { get; set; } 

     public List<ObjB> ObjBList { get; set; } 

    } 


    public class ObjA 
    { 
     public int ID1 { get; set; } 
     public int ID2 { get; set; } 

     public void DoSomething() 
     { 
      //Do something Here 
     } 
    } 

    public class ObjB 
    { 
     public int ID1 { get; set; } 
     public int ID2 { get; set; } 
    } 
0

私はMainObjectListがリストであるとは思わない。以下のコードを参照してください:

public class Test 
    { 
     public MainObj MainObjList { get; set; } 

     public Test() 
     { 
      var groups = from a in MainObjList.ObjAList 
         join b in MainObjList.ObjBList on a.ID1 equals b.ID1 
         where a.ID2 == b.ID2 
         select new { a = a, b = b }; 

     } 

     public class MainObj 
     { 
      public List<ObjA> ObjAList { get; set; } 

      public List<ObjB> ObjBList { get; set; } 

     } 


     public class ObjA 
     { 
      public int ID1 { get; set; } 
      public int ID2 { get; set; } 

      public void DoSomething() 
      { 
       //Do something Here 
      } 
     } 

     public class ObjB 
     { 
      public int ID1 { get; set; } 
      public int ID2 { get; set; } 
     } 
    } 
0

何かこれは何ですか?

MainObjList.ForEach(x => 
{ 
    x.ObjAList.Where(a => x.ObjBList.Any(b => b.ID1 == a.ID1 && b.ID2 == a.ID2)) 
       .ToList() 
       .ForEach(m => m.DoSomething()); 
}); 
関連する問題