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



BeitragVerfasst: Mo 16.04.12 22:36 
tja wie fang ich an ????
also,aus einer textdatei werden bestimte schlüsselwörter herausgefiltert und in einer klasse als string zwischen gespeichert.
irgendwan wird dises object aufgerufen/selektiert ,hier kommt es zum abgleich mit der combobox ,die alle möglichen schlüsselwörter in einer liste ,intern gespeichert hat. gut soweit alles im grünen bereich.
beispiel:
key gehört zu einer klasse.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
static public string[] Keyary = new string[] {"FAM_INVALID","FAM_CREATURE","FAM_STATIC"};
combobox1.Datasource = Keyary; 

irgenwo:

string key = parseline.substring.......

woanders,wenn Selekt :

combobox.SelectItem = key;

jetz hat sich aber von hinten ein kleiner fieser gedanke eingeschlichen.
und zwar, das der inhalt des strings in der klasse und der inhalt des gleichen strings im array(vom inhalt her) nicht auf die gleiche instanz zeigen ,sprich das es zwei instanzen eines strings gibt mit selben inhalt.(ist doch richtig oder ?)
der erste gedanke war,dehn stringtyp in der klasse in einen integer zu ändern,um die position des äqualenten strings in der liste zu speichern,die vorgehendsweise wäre so,das ich beim filtern,die liste mit dehn schlüsselstring durchgehe und vergleiche und bei übereinstimmung dehn index speichere.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
string tmpkey = parseline.substring ....

int keyindex =    Keyary.Finde(tmpkey)

woanders:

combobox.SelectIndex = keyindex;

aber bei genauerer überlegung mag dieses bei 20-30 elementen in der liste noch gehn aber bei 100 - 150 elementen ?? ,ich weiss nicht ?
der zweite gedanke war gewesen ,die liste in eine Enumklasse umzuwandeln,die combobox denn per Enum.Names füllen um dan beim filtern per tryparse dehn zugehörigen index des types zu speichern.
beispiel:
ausblenden 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:
public enum Key
{
  FAM_INVALID,
  FAM_CREATURE,
  FAM_STATIC
}

combobox init.

combobox1.Datasource = Enum.Names(......)

filtern:

string tmpkey  = parseline.substring(....)
Key key;

if( Enum.tryparse<Key>(tmpkey,out key) == false)
{
  fehler
}

woanders:

combobox1.SelectIndex = (int)key

das letztere hat für mich einen leichten nachgeschmack,da hier bestimmt mit reflection gearbeitet wird und das meines wissens auch nicht gerade resourcen schonend und schnell ist.

ich hoffe ich konnte es einigermassen darstellen.

kan mir jemand diesbezüglich einen rat geben was am wenigsten speicher beansprucht und schnell genug ist.

(puh,fertig)

mfg nuckey
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: Mo 16.04.12 23:17 
Das mit den Enum ist vermutlich Humbug. Um mit visuellen Controls zu arbeiten wird das auch wieder nur in ein String Array konvertiert und nachher wieder zurück. Da ein Enum die Lesbarkeit vermutlich nicht erhöht kann man auch gleich ein string Array nehmen. Wenn dein Keyary so sortiert ist wie die Combobox, und da scheinbar dein Array eine hartcodierte Liste kannst du selbst dafür sorgen, kannst du direkt damit arbeiten ohne irgendwelche Suchverfahren da ComboboxIndex == ArrayIndex.

Zitat:
und zwar, das der inhalt des strings in der klasse und der inhalt des gleichen strings im array(vom inhalt her) nicht auf die gleiche instanz zeigen ,sprich das es zwei instanzen eines strings gibt mit selben inhalt.(ist doch richtig oder ?)


String ist zwar eine Klasse aber du kannst sie dir eigentlich fast immer als Wertetyp denken. Es sollte also nie zwei Verweise auf die gleiche string Instanz geben können. Hinter der String Klasse liegt aber wieder das sogenannte String interning. Strings mit gleichem Inhalt sind dann zwar verschiedene String Instanzen verweisen aber auf den selben Eintrag in der Interning Tabelle. Jede eindeutige Zeichenfolge existiert also nur einmal im Speicher egal wieviele Stringinstanzen den gleichen Inhalt haben. Das Ganze ist aber ein Implementierungsdetail und könnte sich je nach Franmework Version unterscheiden oder in Zukunft ganz anders gelöst werden. Man sollte sich also nicht auf dieses Verhalten verlassen und dahin anfangen zu optimieren. Zumindest nicht solange man kein Problem hat oder nur Probleme vermutet.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Di 17.04.12 07:05 
dank dir ralf.
ja dir stringarray verändert sich nicht mehr.
da man bei enum die "Namen" herausnehmen,bestimmen (wie aúch immer) kann,müssen diese ja irgendwo stehn und aus bauch heraus nahm ich an das dort reflection eingesetzt wird,also auch doppelt gemoppelt.
da ist das arbeiten direkt mit dehm index wesentlich effektiver,wie schon beschrieben wird die liste ,alle vorkommenden schlüsselwörter enthalten (so um die 100 rum).
werde mal per zeitmessung das suchen in der liste messen.(da ja zuerst nur ein string zu verfügung steht)
aber deine antwort ,lässt die sache doch etwas klarer aussehn ;)

habe jetze mal die zwei string testhalber verglichen,per equal
ausblenden Quelltext
1:
2:
3:
4:
       if (key.Equals(Keyary[0]))
       {
             int z = 0;
       }

soweit ich Equal verstanden habe vergleicht er nur die instanzen,der beiden objecte.
und das ergebniss war das er true ausgab,also die aussage von ralf richtig war.
also heist dieses doch ,das ich mit indexwerten nicht zu arbeiten brauche ,da ja der string per instance gespeichert wird ?!?,also mein ursprüngliche fassung ,weiter verwenden kann.

mfg nuckey
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Di 17.04.12 16:11 
nun mittlerweile habe ich das ursprünglich zenario untersucht,
hatte mir eine testfunktion geschrieben was mir erlaubte die adressen der strings auszugeben.(unsafe pointer)
musste dabei feststellen das der string aus dehm array und String key ,zwar dehn selben inhalt hatten aber unterschiedliche adressen.
nach einigen suchen ,fand ich diese methode String.Intern und IsInterned
mit String.Intern wird imprinzip der interne stringpool abgeglichen.
mein jetziger TestCode sieht so aus
ausblenden Quelltext
1:
 string key = String.Intern( parseline.Substring.....);					

nach erneuter prüfung sind jetz die adressen gleich.
leider finde ich keine beiträge in deutsch ,in wie fern man dieses einzetzen sollte in bezug auf performance.

desweiteren nutze ich anstatt string[] ,stringcollection da diese intern schon findalgo. hat um string zu suchen und dehn index auszugeben.(falls doch int genutzt werden soll)

mfg nuckey
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: Di 17.04.12 17:00 
Zitat:
desweiteren nutze ich anstatt string[] ,stringcollection da diese intern schon findalgo. hat um string zu suchen und dehn index auszugeben.(falls doch int genutzt werden soll)


Falls du hier die IndexOf Methode meinst dann sei dir bewusst das StringCollection einfach nur auf Array.IndexOf zurückfällt.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Di 17.04.12 17:35 
:) jo indexof meinte ich ;)
je länger ich mich mit dieser sache beschäftige um zu verwirrender ist es.
bisher haben sich zwei dinge herauskristalliesiert (jedenfalls fast)

einmal die string methode.hier sehe ich aber noch nicht ganz durch wie und wann er strings verwaltet,da die meisten abhandlungen in engl. sind wird es eine weile dauern bis ich durch bin.

die zweite ist das ich dehn index speichere.
da die elemente des array sich nicht ändern und ,das Array Selbst per Indexof die möglichkeit bietet dehn keystring in der liste zu suchen und dehn index auszugeben ,dürfte das letzte besser zu händeln sein,ohne grossartig nachzudenken über die instanzen der strings.

heist erstmal für mich,lesen ,testen ,kugel geben ;)

mfg nuckey