2010-01-11 79 views
1

我有位的情况类似的对象 - 基本上,每个对象都实现了基本类型的集合。所以......递归选择相似对象(LINQ)

项目1 - 列表Items2 - 列表Items3

公开名单特价{获得;组; }

项目2:项目1 项目3:项目1

特别 { 公共int值{获得;组; } public string Name {get;组; } }

现在,我可以沿着树去获取东西 - 但我想基本上想要从整个对象中一直沿着树遍历所有“特殊”类实例,单一收藏。

这可能与LINQ?或者我只需要依赖非常复杂的循环?

+0

你标记它的LINQ到SQL,但没有对你的问题的数据库,只有提起的对象。你的意思是Linq的对象? – 2010-01-11 21:10:47

+0

你说得对,我没有澄清这一点。这只是Linq到对象 - 使用C#。 – Ciel 2010-01-11 21:13:33

回答

2

您可以结合使用LINQ的递归函数:

static IEnumerable<Special> getSpecials(Item1 item1) 
{ 
    var item2Specials = item1.Items2.SelectMany(item2 => getSpecials(item2)); 
    var item3Specials = item1.Items3.SelectMany(item3 => getSpecials(item3)); 
    return item1.Specials.Concat(item2Specials).Concat(item3Specials); 
} 

这是一个有点困难,我理解你对你的类结构的符号。我假设你的意思是下面的C#类:

class Item1 
{ 
    public List<Item2> Items2 = new List<Item2>(); 
    public List<Item3> Items3 = new List<Item3>(); 
    public List<Special> Specials = new List<Special>(); 
} 

class Item2 : Item1 { } 
class Item3 : Item1 { } 

class Special 
{ 
    public int Value { get; set; } 
    public string Name { get; set; } 
} 

我也假设你的意思是LINQ到对象,而不是LINQ到SQL。如果你想在数据库中存储heirarchical数据,你不应该这样做,而应该看看nested set model

+0

@Mark Byers +1。非常好的答案。 – dcp 2010-01-11 21:13:26