1

次のようなオブジェクト グラフがあるとします。

A --> B[] --> B1[]
          --> B2[]   
  --> C[]

B1 と B2 のメンバー/プロパティの特定の条件を確認し、b2.Code が C[] 内のどこかに表示されていることを確認する必要があります。すべての条件が満たされた場合、C および B 配列の要素から変数を使用して新しいオブジェクトを作成する必要があります。私の現在の試みを以下に示しますが、これを LINQ でより簡潔にできるかどうか疑問に思っていますか?

   A a = GetA();
   List<MyTest> tsts = new List<MyTest>();
   foreach (B b in a.B)
    {
        foreach (B1 b1 in b.B1)
        {
            if (b1.State == ("READY"))
            {
                foreach (B2 b2 in b.B2)
                {
                    var tst = (from c in a.C
                           where c.Code == b2.Code && !c.IsRedundant
                           select new MyTest
                           {
                               Code = c.Code,
                               BVal = b.BVal,
                               C1Val = c.C1                     
                           }).FirstOrDefault();
                    if (tst != null)
                        tsts.Add(tst);
                    break;
                }
            }
        }
    }
4

1 に答える 1

2

絶対。基本的に、各 newはおおまかに追加の句foreachに相当します。from

var tests = from b in GetA().B
            from b1 in b.B1
            where b1.State == "READY"
            from b2 in b.B2.Take(1)
            from c in a.C
                       .Where(x => x.Code == b2.Code && !c.IsRedundant)
                       .Take(1)
            select new MyTest
            {
                Code = c.Code,
                BVal = b.BVal,
                C1Val = c.C1                     
            };

var testList = tests.ToList();

これに関するいくつかの注意事項:

  • を実際に使用していないのは奇妙に思えますが、「準備完了」状態にあるb1それぞれに対して追加のテスト セットを作成します。b1
  • breakループ内の無条件は、foreach (B2 b2 ...)基本的に、ループ本体を 1 回だけ実行することを意味します。Take(1)
  • 最も内側のクエリの最初の結果のみを使用する方法はTake(1)、最大で 1 つの結果を取得するための呼び出しを含む内部クエリ (拡張メソッドを介して表現) を取得した理由です。

これらの奇妙さの一部を削除できる可能性は十分にありますが、実際に何を達成しようとしているのかは明確ではないため、元のクエリをできるだけ忠実に再現するコードを作成しようとしました.

于 2011-08-04T06:03:39.923 に答える