Array "Sortieren"

Fridulin

Erfahrenes Mitglied
Hallo Leute,

ersteinmal wünsche ich euch ein frohes neues Jahr und ich hoffe ihr seid gut reingerutscht.
Zu meinem Problem, mein Array sieht folgendermaßen aus:
Code:
3192.1
queryid

final
999
ping_1
0
deaths_1
0
frags_1
Nick1
player_1
7
ping_0
0
deaths_0
0
frags_0
Nick2
player_0

Wie bekomme ich das jetzt am Besten sauber gepackt in mehrere Arrays? Am ende soll jedes Item in einer ListView dargestellt werden, mit Spielername, Ping, Abschüße u.s.w.
Oder gehe ich den die Sache ganz falsch an und man sollte es doch in 1 Array lassen? Wenn ja wie Sortiere ich das denn in den 1 Array?

Für Vorschläge währe ich sehr Dankbar.
Viele Grüße und vielen Dank im Vorraus

Fridulin
 

mage

Erfahrenes Mitglied
Wenn ich das richtig verstanden habe gehöhren, dabei immer drei Arrayeinträge zu einem Typ.
Warum erstellt du nicht ein Objekt oder ein Typ mit den Eigenschaften und pakst diese dann in eine Arraylist.
 

zioProduct

Erfahrenes Mitglied
Hoi,
Also wenn du das Array da oben, in mehrere Arrays teilen willst, sehe ich dein Problem nicht ganz. Liegt am Aufteilen? Du kannst ja ne Abfrage machen, ich seh noch nicht ganz, was bei dir Zusammgengehört, aber du könntest ja die Abfrage machen indem du nach Player fillterst, und immer alle Daten bis zu Player in ein Array schreibst. Bist du bei Player, fängst du an in ein neues Array zu schreiben, bis dein Filter(Player) wieder eintrifft... Oder wie oder was?

Sehe dein Problem noch nicht so ganz...

mfg
ziop
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo Fridulin!

Lang ist es her... :)

Wie mage schon sagte ist das implementieren einer Objektsammlung wirklich komfortabler.
Es ist möglich sich eine Samlung zu stricken duch die man sortiert Iterieren kann.
Hiefür müssen die Objekte zunächst das IComparable Interface imlementieren.
Code:
class Player : IComparable
{

	public string Name {
		get { return _Name; }
		set { _Name = value; }
	}

	string name;

	//TODO: Weitere Spieler Propertys imlementieren

	public DictionaryEntry ToDictionaryEntry() {
		return new DictionaryEntry(this.Name, this);
	}

	public int CompareTo(object obj) {
		int result = 0;
			
		if ( obj is Player )
			result =  this.name.CompareTo( ((Player) obj).Name );

		return result;
	}
}
Als nächstes brauchst Du eine Sammlung auf Collection Basis.
Ob Du jetzt CollectionBase oder DictionaryBase verwendest, ist Dir überlassen.
Ich hab das erstere genommen.
Code:
class PlayerColl : DictionaryBase
{

	public Player this[ string key ] {
		get { return ((Player) Dictionary[ key ]); }
		set { Dictionary[ key ] = value; }
	}

	public ICollection Keys {
		get { return (Dictionary.Keys); }
	}

	public ICollection Values {
		get { return (Dictionary.Values); }
	}

	public void Add( string key, Player value ) {
		Dictionary.Add( key, value );
	}

	public bool Contains( string key ) {
		return (Dictionary.Contains( key ));
	}

	public void Remove( string key ) {
		Dictionary.Remove( key );
	}

	#region IEnumerable Members

	public new IEnumerator GetEnumerator() {
		return new PlayerEnumerator( Dictionary.Values );
	}

	#endregion
}
Wie man sehen kann wurde die Funktion GetEnumerator mit new überschrieben,
hier werden wir einen benutzerdefinierten Enumerator zurück geben.
In diesem Enumerator werden die Dictionary.Values der Collection in einem Array gespeichert
und mithilfe der IComparable Implementation des Player Objekts sortiert. ;-)
Code:
internal class PlayerEnumerator : IDictionaryEnumerator
{
	int index = -1;

	ArrayList playerList;

	public PlayerEnumerator( ICollection Values ) {
		playerList = new ArrayList();
		playerList.AddRange( Values );
		playerList.Sort();
	}

	public bool MoveNext() {
		this.index++;
		if ( index >= this.playerList.Count )
			return false;

		return true;
	}

	public void Reset() {
		this.index = -1;
	}

	public object Current {
		get {
			if ( this.index < 0 || index >= this.playerList.Count )
				throw new InvalidOperationException();

			return this.playerList[ index ];
		}
	}

	public DictionaryEntry Entry {
		get { return ((Player) this.Current).ToDictionaryEntry(); }
	}

	public object Key {
		get { return this.Entry.Key; }
	}

	public object Value {
		get { return this.Entry.Value; }
	}
}
A Dictionary Collection Sorting By Value - The Code Project ;)

MfG, cosmo
 
Zuletzt bearbeitet:

Christian Kusmanow

Erfahrenes Mitglied
Nachtrag:
Ich sehe ein das der Aufwand für ein Spiel evtl. auch zu groß sein kann.
Daher möchte ich anmerken das es ansich auch nur mit der Player Klasse und einer ArrayList funktioniert.
Es reicht das IComparable Interface zu implementieren,
mit dessen Hilfe anhand eines Propertys der Klasse sortiert werden kann.

MfG, cosmo
 

Fridulin

Erfahrenes Mitglied
Hi,

vielen Dank für eure Antworten und eurer Mühe.
Besonders vioele Grüße an Cosmo. :)

Zu mage
Warum erstellt du nicht ein Objekt oder ein Typ mit den Eigenschaften und pakst diese dann in eine Arraylist
In OOP Programmieren habe ich leider immer noch nicht besonders viel Erfahrung.

zu zioProduct
alle Daten bis zu Player in ein Array schreibst. Bist du bei Player, fängst du an in ein neues Array zu schreiben, bis dein Filter(Player) wieder eintrifft... Oder wie oder was?
Genau so habe ich es mir Gedanklich auch vorgestellt, nur mein Problem liegt an der Bewerkstelligung. Sprich ich weiß nicht wie ich das Realisieren soll.

Zu Cosmo
Vielen Dank, da versuche ich mich mal hinterzuerklemmen. Eine Frage, wie spreche ich denn die Klasse an. Mein Array wo z.Z. alles drinne ist heißt splittedData. Und wie bekomme ich das wieder aus der Klasse raus? Ich verstehe das leider nicht so ganz. Du weißt ja in meinen OOP Kenntnissen sieht es ziehmlich düster aus und ich hatte auch noch nicht die Gelegenheit mir dieses näher zu legen. Aber veilleicht wenn du mir die beiden Fragen beantworten könntest, verstehe ich das und blicke da durch.

Vielen Dank nochmals an alle für die Hilfe und Mühe.
Grüße
Fridulin
 

Christian Kusmanow

Erfahrenes Mitglied
Fridulin hat gesagt.:
wie spreche ich denn die Klasse an. Mein Array wo z.Z. alles drinne ist heißt splittedData. Und wie bekomme ich das wieder aus der Klasse raus?
Nicht das Du nur des Sortierens wegen die Werte aus dem Array ausliest,
in Klassen schiebst und nach dem sortieren wieder hinein schreiben willst.
Versuch doch gleich dem Programm einen OOP gerechten Aufbau zu verpassen. :)
Was bringt es Dir die Spielerdaten in einem Array unter zu bringen?
Meinst nicht Du hättest einen gewaltig kleineren Aufwand das mit ner Klasse zu realisieren? ;)
Du müsstest Dich nicht mal um die Indexer der Daten kümmern und würdest jetzt nicht so eine Frage stellen.

Führ doch mal bitte alle Daten auf, die dem Spieler zugeordnet sind
und versuch die Klasse dementsprechend zu erweitern.
Denke mal das Du das schaffst. Wenn Du das hast, verwendest anstatt deines Arrays eine ArrayList zum speichern der Player.

Wenn Du ein String Array mit den Daten des Spielers haben möchtest, um sie in dem ListView einfach anzuzeigen,
kannst eine Funktion in deiner Player Klasse implementieren die das für Dich erledigt.
Des weiteren kannst auch das ToString() überschreiben,
damit die Eigenschaften des Spielers angezeigt werden wenn Du ihn in einem ListenElement (Combo- ListBox) anzeigst.
Code:
class Player : IComparable
{
	public string Name {
		get { return name; }
		set { name = value; }
	}

	public string Points {
		get { return points; }
		set { points = value; }
	}

	string name;
	int points;

	public override string ToString(){
		return name + " " + points;	
	}

	public string[] ToStringArray() {
		return new string[2]{ name, points };
	}

	public int CompareTo(object obj) {
		int result = 0;
			
		if ( obj is Player )
			result =  this.name.CompareTo( ((Player) obj).Name );

		return result;
	}
}
Jetzt hast eine Klasse welche sich in einer Arraylist einfach sortieren lässt.
Wenn Du nicht weisst wie Du damit arbeiten sollst, sag Bescheid ich mach Dir ein Beispielprog. :)

MfG, cosmo
 
Zuletzt bearbeitet:

Fridulin

Erfahrenes Mitglied
Hi,

vielen Dank für deine Hilfe.

Nicht das Du nur des Sortierens wegen die Werte aus dem Array ausliest,
So hatte mich mir das eigentlich ersteinmal gedacht muß ich leider zugeben.

Wenn Du ein String Array mit den Daten des Spielers haben möchtest, um sie in dem ListView einfach anzuzeigen,
So etwas währe natürlich das Optimum.

Ich muß leider gestehen das ich nicht weiß wie ich mit deiner Klasse Arbeiten soll, es währe natürlich super wenn du vielleicht ein Beispiel Programm für mich hast.
Die Klasse muß 4 Sachen verarbeiten und in einer Listwiew anzeigen können. Einmal die Speiler ID, Ping, Gestorben, Frags und natürlich den Spielernamen. Was ich vom Server zurückgeliefert bekomme siehst du ja oben.

Vielen Dank nocheinmal und es muß natürlich nicht sofort sein, nur wenn du Lust udn Zeit hast und es dir nicht zuviel Umstände macht. Was mir natürlich noch sehr dabei Helfen würde, ist wenn du eventuell ein paar Kommentare dazuschreibst.

Viele liebe Grüße
Fridulin
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo Fridulin!

So, das Tool ist fertig. Hab Dir eine Spieler Sammlung auf CollectionBase Basis implementiert.
Diese lässt sich problemlos sortieren ;-) und Zugegriffen wird via Index.
Working with collections in the .NET Framework - TheCodeProject

Wenn Du schon in einer Spache codest die auf der OOP aufsetzt, solltest sie auch nutzen.
Das ist die tragende Grundlage nach den Operatoren, DatenTypen und Sammlungen von c#. ;)
Kauf Dir endlich ein Buch darüber (!) buecherbillig.de - C#

Ansonsten viel Spaß damit. :)

MfG, cosmo
 

Anhänge

  • PlayerCollection.zip
    13,4 KB · Aufrufe: 47

Fridulin

Erfahrenes Mitglied
Hi Cosmo

Vielen Dank für dein Programm und deine ganze Mühe. Ich werde mal ein bischen mit dem Programm herumexperimentieren und hoffen das ich dann darin Richtig durchblicken kann. Ich hoffe auch das ich die, für mich, abstrakte denkweise der Klassen mal verstehe.
Aber ein Problem bleibt mir da noch, oder ich hab das noch nicht verstanden in deinen Programm, wie ich jetzt mein Array welches auch noch von nicht belangen Daten enthält in die int Deaths ec. aufteilen kann und verarbeiten kann. Vielleicht kannst du mir ja noch einen kleinen Denkanstoß geben.

Vielen Dank nocheinmal und Liebe Grüße
Fridulin