2009-10-05 12 views
2

Je suis en train de trier un ArrayList d'articles personnalisés et obtenir « au moins un objet doit implémenter IComparable. » malgré avoir implémenté l'interface IComparable pour eux. J'appelle simplement le Sort() par défaut aucun paramètre ou n'importe quoi. La définition de l'objet que j'essaie de trier est la suivante:Problèmes avec tri et de IComparable

class AssetItem : System.IComparable<AssetItem> 
{ 
     public string AssetName { get; set; } 
     public int AssetID { get; set; } 

     public int CompareTo(AssetItem item) 
     { 
      if (null == item) 
      { 
       return 1; 
      } 
      else if (this.AssetID < item.AssetID) 
      { 
       return -1; 
      } 
      else if (this.AssetID == item.AssetID) 
      { 
       return this.AssetName.CompareTo(item.AssetName); 
      } 
      else 
      { 
       return 1; 
      } 
     } 

Ce code se construit très bien. Une autre chose à garder à l'esprit, et je soupçonne que c'est peut-être le problème même si je ne comprends pas comment, la classe ci-dessus est une classe interne. Si c'est ce qui me fait trébucher, comment feriez-vous pour comparer une classe interne?

Répondre

9

Vous avez mis IComparable<T>, pas IComparable. Ce sont des interfaces différentes. Si vous utilisez des génériques, utilisez simplement List<T> pour commencer. Je veux dire que pourrait également mettre en œuvre IComparable, mais je voudrais juste quitter les collections non génériques quelque peu obsolètes si j'étais vous.

+0

Doh, qui était un nobrainer. Merci pour l'aide en tout cas! – Trajanus

+0

J'ai eu le même problème, merci! Cela me fait me demander, pourquoi IComparable hérite d'IComparable? – jrummell

+1

@jrummell: Cela le forcerait à essayer de se comparer à * n'importe quel * objet, au lieu de juste les objets du bon type, ce qui est un peu pénible. –

3

Peut-on utiliser LINQ dans votre projet? Si c'est le cas, et si tout ce dont vous avez besoin est le tri par une propriété, vous n'avez pas besoin d'implémenter IComparable. Vous pouvez tout simplement faire:

theAssetsList.OrderBy(asset => asset.AssetId); 
0

Vous pouvez également essayer .. liste = new List (list.OrderBy (x => x.Text));