2010-05-14 5 views
4

J'ai une liste qui a diverses classes dérivées. Je peux avoir quelque chose comme ceci:LINQ groupe un type d'article

List<BaseClass> list = new List<BaseClass>() { 
    new Class1(), 
    new Class2(1), 
    new Class3(), 
    new Class2(2), 
    new Class4() 
}; 

Je suis en train d'utiliser LINQ semi-tri de la liste de sorte que l'ordre naturel est maintenue, excepté Classe2. Toutes les instances de classe 2 doivent être regroupées à l'endroit où se trouve la première classe2. Voici ce que la sortie devrait être comme:

List<BaseClass> list = new List<BaseClass>() { 
    new Class1(), 
    new Class2(1), 
    new Class2(2), 
    new Class3(), 
    new Class4() 
}; 

Je ne peux pas pour la vie de me comprendre comment faire ...

+0

Essayez-vous de trier la liste en fonction du nom de la classe? Je ne suis pas sûr de suivre. –

+0

@Ryan: Il veut déplacer toutes les instances d'une classe particulière vers la position de la première instance. Vois ma réponse. – SLaks

+0

@Ryan, c'est ce que SLaks a dit. Le nom de la classe est en ordre dans cet exemple, mais il peut s'agir de n'importe quel nom (Foo, Bar, Cheese ...). –

Répondre

3

Vous pouvez le faire comme ceci:

list = list 
    .TakeWhile(o => !(o is Class2)) 
    .Concat(list.Where(o => o is Class2)) 
    .Concat(
     list.SkipWhile(o => !(o is Class2)).Where(o => !(o is Class2)) 
    ) 
    .ToList(); 

Ceci prendra tous les articles jusqu'au premier article Class2, suivi de tous les articles Class2, suivi de tous les autres articles non Class2.

+1

Vous aurez besoin d'un .Cast () après l'appel OfType afin que les listes puissent être concaténées. –

+0

Je ne l'ai pas encore testé, mais vous l'avez bien compris. J'essaie toujours d'envelopper ma tête autour de la puissance de LINQ. –

+0

@Martin: Oui; J'ai oublié cela. – SLaks