2010-01-11 80 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