This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: Mit IComparable mehrere Eigenschaften vergleichen
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Nehmen wir als Beispiel eine Highscore-Liste. Hierf��r m��ssen zwei Werte sortiert werden:
- der erreichte Score (absteigend)
- der Name des Spielers (aufsteigend)
Mit Hilfe der Schnittstelle IComparable kann dies einfach erledigt werden. Hierf��r ben��tigen wir die Datenklasse Highscore, welche besagtes Interface implementiert:
using System;
using System.Collections.Generic;
using System.Text;
namespace HighscoreTest
{
publicclass Highscore : IComparable
{
privatestring _name = String.Empty;
privateint _score = 0;
publicstring Name
{
get { returnthis._name; }
set { this._name = value; }
}
publicint Score
{
get { returnthis._score; }
set { this._score = value; }
}
public Highscore(string name, int score)
{
this._name = name;
this._score = score;
}
publicoverridestring ToString()
{
returnthis._name.PadRight(20, ' ') + this._score;
}
#region IComparable Members
publicint CompareTo(Highscore other)
{
if (this._score.CompareTo(other._score) == 0)
returnthis._name.CompareTo(other._name);
elsereturnthis._score.CompareTo(other._score) * (-1);
}
#endregion
}
}
Wie in der Methode CompareTo zu sehen ist, ist eine signifikante Eigenschaft auszuw��hlen. Diese ist die Eigenschaft, die vorrangig sortiert werden soll. In unserem Fall der Score. Sind die zu vergleichenden Werte identisch, wird der Name sortiert.
Getestet werden kann dies mit Hilfe der folgenden Zeilen:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Diagnostics;
namespace HighscoreTest
{
class Program
{
staticvoid Main(string[] args)
{
List highscoreList = new List();
highscoreList.Add(new Highscore("Norbert2", 17));
highscoreList.Add(new Highscore("Norbert1", 17));
highscoreList.Add(new Highscore("Norbert3", 3));
highscoreList.Add(new Highscore("Karl", 3));
highscoreList.Sort();
Debug.WriteLine("Highscore");
Debug.WriteLine("--------------------");
foreach(Highscore hscore in highscoreList)
Debug.WriteLine(hscore);
}
}
}
Wie zu sehen ist, gar nicht so schwierig und keinesfalls aufw��ndig.