0

以下の状況を考慮すると、トップ レベルに割り当てられた中間オブジェクトのリストに属する下位クラス レベルのオブジェクトをすべて取得する必要があります。私が持っている構造は、中間レベルのオブジェクトがトップレベルにぶら下がっていることを意味しますが、ボトムレベルはすべてのコレクションです。したがって、リストが存在しない場合でも、トップ レベルとミドル レベルに効果的に「ぶら下がっている」すべてのボトム オブジェクトを取得する必要があります。ラムダでこれを行う良い方法はありますか?

class Program
{
    static void Main(string[] args)
    {
        List<TopClass> topClasses = new List<TopClass>();

        List<MiddleClass> mcList1 = new List<MiddleClass>();
        mcList1.Add(new MiddleClass(1));
        mcList1.Add(new MiddleClass(3));
        mcList1.Add(new MiddleClass(5));
        TopClass tc1 = new TopClass(1, mcList1);
        topClasses.Add(tc1);

        List<MiddleClass> mcList2 = new List<MiddleClass>();
        mcList2.Add(new MiddleClass(2));
        mcList2.Add(new MiddleClass(4));
        TopClass tc2 = new TopClass(2, mcList2);
        topClasses.Add(tc2);

        List<MiddleClass> mcList3 = new List<MiddleClass>();
        mcList3.Add(new MiddleClass(6));
        mcList3.Add(new MiddleClass(7));
        TopClass tc3 = new TopClass(3, mcList3);
        // ** Note not added to the global list

        List<BottomClass> bottomClasses = new List<BottomClass>();
        bottomClasses.Add(new BottomClass(10, 1));
        bottomClasses.Add(new BottomClass(20, 2));
        bottomClasses.Add(new BottomClass(30, 3));
        bottomClasses.Add(new BottomClass(40, 4));
        bottomClasses.Add(new BottomClass(50, 5));
        bottomClasses.Add(new BottomClass(60, 6));
        bottomClasses.Add(new BottomClass(70, 7));

        bottomClass.FindAll(b => ....?
    }
}

public class TopClass //Instruments
{
    public int Id { get; set; }
    public List<MiddleClass> MiddleClasses { get; set; }

    public TopClass(int id, List<MiddleClass> middleClasses)
    {
        this.Id = id;
        this.MiddleClasses = middleClasses;
    }
}

public class MiddleClass // Sequences
{
    public int Id { get; set; }

    public MiddleClass(int id)
    {
        this.Id = id;
    }
}


public class BottomClass //SequenceItem
{
    public int Id { get; set; }
    public int MiddleClassId { get; set; }

    public BottomClass(int id, int middleClassId)
    {
        this.Id = id;
        this.MiddleClassId = middleClassId;
    }
}

結果は、10 から 50 を含むリストになりますが、60 と 70 は含みません。

4

3 に答える 3

1

どうですか

topClasses
 .SelectMany(x=>x.MiddleClasses)
 .SelectMany(x=>bottomClasses.Where(y=>y.MiddleClassId==x.Id))

.Distinct()オプションで、一意性のために最後に追加します

または別の方法から

bottomClasses.Where(
  b=>topClasses.Any(t=>t.MiddleClasses.Any(m=>m.Id==b.MiddleClassId))
)
于 2012-08-31T15:42:31.870 に答える
0

これがあなたの意図したものかどうかはわかりません...

var test = bottomClasses.Where(b => b.Id >= 10 && b.Id <= 50);

そうでない場合は、私が誤解したことについてコメントしてください:)

于 2012-08-31T15:42:24.430 に答える
0

これはあなたが望むものです。したがって、tc3 などの TopClass を指定すると、tc3 にぶら下がっているすべての下位クラスが得られます。

   var allMiddleClasses = topClasses.SelectMany(t => t.MiddleClasses);

    var allBC = 
            bottomClasses
                .Where(b => allMiddleClasses.Select(m => m.Id).Contains(b.MiddleClassId))
                    .ToList();
于 2012-08-31T15:42:48.750 に答える