2010-11-26 5 views
0

J'ai un arraylist avec des objets, maintenant j'ai besoin de les trier.C# sélectionnez dynamiquement l'attribut pour le tri

J'ai cette méthode:

public Int32 CompareTo(object next) 
     { 
      SessionInfo nextCase = (SessionInfo)next; 
      return (this.Duration.CompareTo(nextCase.Duration)); 
     } 

Maintenant je dois changer le dynamicly sortvalue de « Durée » à « Nom » Je fait un attribut appelé SortColumn et lui a donné la valeur « Durée »

maintenant mon code ressemble à ceci:

public string SortColumn { get; set; } 

public SessionInfo() 
    { 
     SortColumn = "Duration"; 
    } 

public Int32 CompareTo(object next) 
    { 
     SessionInfo nextCase = (SessionInfo)next; 
     return (this.SortColumn.CompareTo(nextCase.SortColumn)); 
    } 

ce ne fonctionne pas. Y at-il un moyen de changer la colonne à trier?

Merci!

Répondre

3

Au lieu d'une arraylist, pourquoi ne pas utiliser une liste générique, vous obtenez le tri gratuitement (ou presque):

var list = new List<SesionInfo>(); // then add items 
list.Sort((s1,s2) => s1.SortColumn.CompareTo(s2.SortColumn)); 
2
public int CompareTo(object next) 
{ 
    SessionInfo nextCase = (SessionInfo)next; 
    if(SortColumn == "Duration") 
     return (this.Duration.CompareTo(nextCase.Duration)); 
    else if(SortColumn == "Name") 
     return (this.Name.CompareTo(nextCase.Name)); 
} 
0

La raison pour laquelle il ne fonctionne pas est qu'il est le tri par la La valeur de la propriété SortColumn et tous les objets de votre collection ont la même valeur pour cela. Une façon de le résoudre consiste à utiliser la réflexion pour obtenir la valeur de la propriété nommée par la propriété SortColumn.

public Int32 CompareTo(object next) 
{ 
     SessionInfo nextCase = next as SessionInfo; 
     var sortProperty = this.GetType().GetProperty(this.SortColumn); 

     var currentValue = sortProperty.GetValue(this) as IComparable; 
     var nextValue = sortProperty.GetValue(next) as IComparable; 

     return currentValue.CompareTo(nextValue); 
} 

J'ai laissé les chèques de nullité pour simplifier l'exemple, mais vous devrez tenir compte de ce qui se passe si les propriétés ne sont pas comparables, les valeurs sont nulles, etc.

Une meilleure solution consisterait à utiliser une liste générique et une extension OrderBy. Ensuite, vous pouvez simplement faire:

var sorted = collection.OrderBy(c => c.Duration); 

ou

var sorted = collection.OrderBy(c => c.Name); 

Si vous utilisez Dynamic LINQ, vous pouvez spécifier la colonne par son nom.

var sorted = collection.OrderBy("Duration"); 
0

Oui je serais d'accord, utilisez toujours la liste générique pour ce genre de fonctionnalités que vous obtenez les avantages suivants,

  • Type de sécurité
  • Meilleure performance
  • Pas besoin de casting explicite
  • Meilleurs algorithmes de croissance.

Cordialement,

Sal Zaki

Questions connexes