Autor Beitrag
Nuckey
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mi 18.05.11 08:01 
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")

ausblenden 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

ausblenden 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.

ausblenden 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)
        {
            //ermitteln der max. länge eines strings
            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];   //aufaddieren der charwerte

                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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 18.05.11 13:23 
user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
nun bin ich auf die idee gekommen anstatt die strings ansich zu vergleichen, die einzelnen charwerte aufzuaddieren und dann zu vergleichen.
Dir sollte aber selbst klar sein, dass das bei genügend langen Zahlen schiefgeht :) .
Haben alle Strings das Format "Archon"+Zahl? Überlege dir einmal, wie du an diese ints am Ende kommst, dann kannst du sie direkt und nicht als Strings vergleichen.

user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
jetz hier zu meine frage ,kann mann es verbessern ,in hinblick performance ?
Von wie vielen Objekten sprechen wir hier denn, dass das eine Rolle spielt?

PS: Bitte, bitte lass bei Klassen den C-Präfix fallen. Außerdem sollten Properties nicht mit "Get" und nicht alle Variablen "tmp" genannt werden ;) .

_________________
>λ=
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mi 18.05.11 15:48 
hio kha

also die strings selber sind nicht geösser als 10 zeichen,also ziemlich klein

ja die strings enden alle mit einer zahl und ich hatte auch schon das herauskopieren der ziffer mit anschliesender konvertierung ,aber meine vermutung ist ,das die konvertierei auf die performance drückt bei 10000 datensätzen und mehr.

und der Standartvergleich wie String.Compare und String.CompareOrd. nicht das gew. ergebniss bringen, na ja ,kam ich auf diese idee.

Zitat:

PS: Bitte, bitte lass bei Klassen den C-Präfix fallen. Außerdem sollten Properties nicht mit "Get" und nicht alle Variablen "tmp" genannt werden .

wiso ,weshalb ,warum ??

EDIT:

nach einmal schlafen ,gefällt mir meine lösung soooo nicht mehr und mein alte lösung (kha´s anregung) Konvertierung in integer , na ja bin jetz zum schluss gekommen das die konvertierung nicht im compare stattfinden sollte ,sondern zb.: beim einlesen der textdatei.

ich habe jetz meine objecktklasse eine integer zahl spendiert,beim einlesen und später beim editieren der daten ,werden die strings konvertiert und in die integer zahl abgelegt ,so das im eigentliche Compareverfahren nur die integer zahlen zum einsatz kommen,
dürfte von der performance am schnellsten sein.

gruss nuckey
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.05.11 06:54 
user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
wiso ,weshalb ,warum ??
Weil das unter C# als schlechter Stil gilt.

Das ist in C anders. Der Grund ist aber, dass man dort viel mit Pointern arbeitet und nicht so typsicher wie unter Delphi oder C#. Dort ist der Typ ohnehin vorgegeben, so dass man ihn nicht in den Variablennamen aufnehmen muss.

Typen fangen in Delphi mit einem großen T an, aber das gibt es so in C# nicht.

Der einzige Fall, an dem ich die ungarische Notation für sehr sinnvoll halte, sind Namen von Komponenten (weil es im Hinblick auf die Syntaxergänzung enorm hilft). Aber auch dort wird das in C# nicht benutzt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.05.11 11:09 
Die Framework Design Guidelines bezüglich der Benennung von Typen.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Fr 20.05.11 04:55 
na gut lassen wir das erstmal mit dehn Notationen

habe mittlerweile die methoden gefunden "regex.match" um zahlen aus strings zu extrahieren und kann diese somit leichter konvert. umd diese denn direkt als int zu vergleichen und sortieren ;narf

mfg nuckey