2010-01-11 11 views
1

J'ai un peu la même situation avec des objets similaires. En gros, chaque objet implémente une collection d'un type de base. Alors ...Sélection récursive d'objets similaires (LINQ)

Item1 - Liste envois2 - Liste éléments particuliers3

publique Liste Promotions {get; ensemble; }

Item2: Item1 Item3: Item1

spécial { public int valeur {get; ensemble; } public string Nom {get; ensemble; } }

Maintenant, je peux juste descendre dans l'arbre et obtenir des choses - mais je veux fondamentalement obtenir toutes les intences de classe «spéciale» de l'objet entier, tout le long de l'arbre - en une seule collection unique.

Est-ce possible avec LINQ? ou dois-je juste compter sur des boucles très compliquées?

+0

Vous l'avez étiqueté Linq-to-SQL, mais il n'y a aucune mention de bases de données dans votre question, seulement des objets. Voulez-vous dire Linq aux objets? –

+0

Vous avez raison, je n'ai pas clarifié cela. C'est juste Linq to Objects - en utilisant C#. – Ciel

Répondre

2

Vous pouvez utiliser LINQ en combinaison avec des fonctions récursives:

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); 
} 

Il me était un peu difficile de comprendre votre notation pour votre structure de classe. Je suppose que vous vouliez dire les classes C# suivantes:

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; } 
} 

Je suppose que vous voulez dire Linq à des objets et non LINQ to SQL. Si vous voulez stocker des données heirarchical dans une base de données, vous ne devriez pas faire cela mais regardez plutôt le nested set model.

+0

@Mark Byers +1. Très belle réponse. – dcp

Questions connexes