2009-07-08 4 views
1

J'ai un certain nombre d'objets, tous de la même classe (ColorNum) Chaque objet a 2 membres variabels (m_Color et m_Number)Trier la liste alternative C#

Exemple:

ColorNum1(Red,25) 
ColorNum2(Blue,5) 
ColorNum3(Red,11) 
ColorNum4(White,25) 

Les 4 objets sont dans le ColorNumList

List<ColorNum> ColorNumList = new List<ColorNum>(); 

maintenant, je veux commander la liste de sorte que les objets avec mColor = « Red » est en haut. Je ne m'inquiète pas de l'ordre des objets restants.

À quoi ma méthode de prédicat devrait-elle ressembler?

Répondre

11

LINQ:

var sortedRedAtTop = 
    from col in ColorNumList 
    order by col.Color == Red ? 1 : 2 
    select col; 

Ou la méthode de tri de la liste:

ColorNumList.Sort((x,y) => 
    (x.Color == Red ? 1 : 2)-(y.Color == Red ? 1 : 2)); 
+0

Votre solution LINQ est propre. – tomfanning

0
ColorNumList.Sort((x, y) => x.m_Color == Red ? 1 : (y.m_Color == Red ? -1 : 0)); 
0

Voir http://msdn.microsoft.com/en-us/library/system.array.sort(VS.71).aspx

[C#] public static void Trier (Array, Array, int, int, IComparer);

Vous devez implémenter une fonction qui compare deux objets et renvoie une valeur indiquant si l'un est inférieur, égal ou supérieur à l'autre.

http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare(VS.71).aspx

Vous devez écrire une classe qui implemenets l'interface IComparer.

Je n'utilise C#, mais voici le VB équivalent:

Classe ColorCompare Met en œuvre IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare 
     Dim xc As ColorNum = TryCast(x, ColorNum) 
     Dim yc As ColorNum = TryCast(y, ColorNum) 
     If x.color = Red Then 
      Return 1 
     ElseIf y.color = Red Then 
      Return -1 
     Else 
      Return 0 
     End If 
    End Function 
End Class