zur zeit arbeite ich an einer vergleichsroutine für und mit der ICompareschnittstelle.
die strings die verglichen und sortiert werden sollen beinhalten auch zahlen.
bisher hatte ich in meiner compareclasse die funktion String.Compare als auch String.Compareoordinal verwendet,
aber jedesmal wurden strings, die von der länge her grösser waren zb. "Archon10" vor "Archon2" sortiert.
hier gab die String.Compare funktion -1 aus. zb.: String.Compare("Archon10","Archon2")
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| internal class COjectInfoCompareID : IComparer<CObjectInfo> { public int Compare(CObjectInfo x, CObjectInfo y) { return String.CompareOrdinal(x.GetObjID, y.GetObjID); } } |
als endgültige sortierung wurde zb: dieses ausgegeben
Quelltext
1: 2: 3: 4: 5:
| Archon0 Archon10 Archon2 Archon20 Archon3 |
nun nach einigen suchen bin ich zwar auf einigen lösungen gestossen,empfand aber diese zu aufwändig.
nun bin ich auf die idee gekommen anstatt die strings ansich zu vergleichen, die einzelnen charwerte aufzuaddieren und dann zu vergleichen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| internal class COjectInfoCompareID : IComparer<CObjectInfo> { public int Compare(CObjectInfo x, CObjectInfo y) { int tmpcount0 = (x.GetObjID.Length > y.GetObjID.Length) ? x.GetObjID.Length : y.GetObjID.Length;
int tmpcount1 = 0; int tmpcount2 = 0;
for (int x0 = 0; x0 < tmpcount0; x0++) { if (x0 < x.GetObjID.Length) tmpcount1 += (int)x.GetObjID[x0]; if (x0 < y.GetObjID.Length) tmpcount2 += (int)y.GetObjID[x0]; }
if (tmpcount1 > tmpcount2) { return 1; } else if (tmpcount1 < tmpcount2) { return -1; } else return 0; } |
funzen tut es,jetz werden alle strings richtig sortiert.
jetz hier zu meine frage ,kann mann es verbessern ,in hinblick performance ? und gibt es diesbezüglich einfachere sortiermethoden ?
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt