2012-08-31 54 views
0

考虑到以下情况,我需要获取属于分配给顶层的中间对象列表的所有底层类对象。我所拥有的结构意味着中等水平的对象从顶层挂起,但底层只是所有的集合。因此,即使列表不存在,我也需要获取所有底层对象,以便有效地“暂停”顶层和中间层。有没有一种方法可以在lambda中执行此操作?收藏集Lambda

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

+0

你可以发布类的类结构摘要。你只是想要“底部类”被过滤?我看不到什么属性包括在兰萨达。 编辑︰刚刚看到了班级结构:) – LukeHennerley

+0

所有你的底部类参考一个中产阶级,所有中产阶级挂掉顶级所以肯定所有底部挂起顶级/中产阶级 – saj

+0

@saj但如果你看中间类没有直接引用顶级类或底级类,因此没有明确的链遵循 –

回答

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)) 
) 
+0

谢谢,第二个解决方案正是我以后包含了一个ToList()。 –

0

不知道一个列表,如果这是你所追求的......

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

如果没有请发表评论我有什么误解了:)

+0

OP要求一个特定的过滤器,并指出10-50将是这个特定情况下的正确答案 –

0

这是你想要的。所以给定一个TopClass例如tc3,这会给你所有的底部类挂起tc3

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

    var allBC = 
      bottomClasses 
       .Where(b => allMiddleClasses.Select(m => m.Id).Contains(b.MiddleClassId)) 
        .ToList(); 
+0

谢谢saj,除了这返回60和70,但不是10到50;我将如何反转它? –

+0

看我的编辑将返回一切 – saj