wenn ich zB eine List<> fülle und ein object hinzufügen möchte,
dass noch nicht existiert, dann erhalte ich ja den error, dass auf ein
nicht existierendes objekt verwiesen wurde.
hehe.. naja, das geht eben nicht immer.
also es geht mir darum vordefinierte abläufe zu erfassen.
ich stell mir eine art queue in der form eines array oder einer list vor.
das problem ist das ich noch nicht existente objekte
,listbox einträge,htmlElemente etc noch nicht referenzieren kann.
in meinem verständniss sehe ich 2 möglichkeiten:
1)
das nicht-existente objekt mit einem dummy zu referenzieren.
und dann wenns existiert neu zu instanziieren.
2)
das nicht existente objekt als STRING in meine queue hinzufügen und
dann wenns gebraucht wird, das objekt mit hilfe des strings
neu zu instanziieren oder zu konvertieren (reflection/casting)
ich habe soo viel probiert und habe bereits in einigen threads nach lösungen
gesucht, bin aber noch nicht fündig geworden.
Für diese Aufgabe eignet sich eine Hashtable statt einer gewöhnlichen Liste ganz gut. Verwende dafür das Dictionary<T,T>, die Schlüssel/Wert-Datentypen kannst du dabei selbst festlegen und über die Collection der Schlüssel könntest du iterieren.
der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
hm, ich denke, dass man mit einer Hashtable (Dictionary) auch nicht um den Kern meiner Aussage herumkommt. Nur dass der Stellvertreter dann eben der Key ist. Außerdem schrieb ja Nullpunkt was von Queue, dass spricht dafür, dass eine Reihenfolge eingehalten werden muss, die bei eine Hashtable erstmal nicht gegeben ist.
ok, ich steh leider voll aufm schlauch mit diesen datentypen.
über das thema hashtables/dictionary erhalte ich in msdn deutsch
eine leere seite und in us-en begreif ichs auch nicht 100%
der Marcel,
muss ich das so notieren:
Dictionary<HtmlElement,string> hans = new Dictionary<HtmlElement,string>();
hans.Add(inet.Document.Links[7],"test");
oder doch so?
Dictionary<string,string> hans = new Dictionary<string,string>();
hans.Add("HtmlElement","inet.Document.Links[2]");
ich kriege bei der ersten lösung den selben error wie vorher (objekt ist null).
ich sehe echt den wald nicht mehr, wäre lieb wenn du mir vielleicht
ein kurzes beispiel zeigen/machen könntest?
Da die Reihenfolge bei dir anscheinend von vornerhein feststeht (Soll heißen, dass du schon beim ersten weißt, dass es meinetwegen an die 100. Stelle kommt) würde ich auch ein Dictionary verwenden.
Mein Vorstellung, welche ich beim Antworten hatte, war das Codebeispiel von herbivore in Grundlegendes zu Hashtables, welches ich hier nochmal herausgreife:
a [5] = 97;
a [8798] = 97;
a [9979679] = 97;
Das würde an dieser Stelle bedeuten, dass der Schlüsseldatentyp ein int ist.
Bei
Dictionary<HtmlElement,string> hans = new Dictionary<HtmlElement,string>();
hans.Add(inet.Document.Links[7],"test");
geht wahrscheinlich schief, dass inet.Document.Links[7] = null ist und damit kein Objekt dahinter steht. Stattdessen würde ich eben schreiben
Dictionary<int, string> hans = new Dictionary<int, string>();
hans.Add(7,"test");
der Marcel
EDIT1+2: Berichtigungen
EDIT3: Seltsamerweise bekomme ich auch leere Seite bei der deutschen Dictionary-Hilfe in der MSDN, würde meinen, ich war da schonmal.
Alternativ steht sie aber in der Offline-Version der MSDN auf Deutsch bereit.
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
vielen dank für deinen ausführlichen beitrag.
das problem ist aber, dass die struktur der verschiedenen
nicht-existenten objekten nicht immer gleich ist.
zB:
1)
inet.Document.Links[0]
2)
inet.Document.Links["test"]
3)
inet.Document.All["sonstwas"]
4)
inet.Document.Forms[0]....
verstehts du?
ich sollte also schon die ganze referenz erfassen können : (
Nun habe ich 2 Fragen:
Weißt du bei jedem Element die exakte Position in der Liste? (also zB Index 100)
Oder fügst du zwischen 2 vorhandenen Objekten eins ein und die genaue Indexierung ist variabel?
Wenn die Indexierung variabel ist (was ich bisher nicht angenommen hatte), dann wäre vielleicht eine List<> doch das richtige, diese hat eine Methode Insert
der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
Welche Objekte möchtest du denn Adden?
ich dachte vorhin inet.Document.Links[7] ist nicht das Element, welches du Adden möchtest. Scheint es aber zu sein, oder?
Mit dem Dictionary müsste der Fall doch dann klar sein. Wenn die Elementposition vorher fest steht, dann erstellst du ein Dictionary<int, Link>. das int steht als Schlüssel für die Position in der Reihenfolge und der Wert ist dann das zugehörige Objekt (in meinem Beispiel Link) an dieser Stelle. Ich denke, du hast bisher vielleicht den Sinn von Schlüssel und Wert verwechselt.
der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
Dann Adde es doch erst dann, wenn es da ist! Das heißt auf null prüfen und wenn dem so ist, nicht adden und weiter. Wenn dies nicht geht, dann musst du die schon erwähnten Platzhalter einfügen.
Der Vorteil den ich beim Dictionary sehe, ist, dass es 2 Elemente haben kann, welche sich zB jedoch schon als queue[0] und queue[89] ansprechen lassen. Über die Schlüssel kann man ja auch einfach iterieren und so jedes vorhandene Element ansprechen.
der Marcel
EDIT: Wenn es nicht geht, bützen dir auch die Platzhalter nichts, denn auch die musst du ersetzen, wenn die eigentliche Referenz dann mal auf ein Objekt zeigt
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
vielleicht muss ich ja auch eine wenig weiter ausholen.
IDEE
Ich möchte zuerst einen von mir durchgeführten webseitenbesuch
mit einigen klicks und texteingaben etc recorden.
diesen record kann ich dann zB jeden tag um 15.00 wieder ablaufen lassen.
das ziel soll dann sein, bei diesem virtuellen besuch gewisse daten wie
cookies, ladedauer etc abzuspeichern.
MOMENTANES PROBLEM
das in diesem angesprochene problem ist eben genau, dieser record bzw. diese
step-by-step liste abzuarbeiten, da noch nicht (und auch zu keiner zeit) ALLE diese
elemente und steps existieren.
das ziel soll ja sein, nach dem documentCompleted-event den nächsten
arbeitsschritt einzuleiten.
wenn ich jetzt also zB folgende 2 steps habe:
inet.Document.Links[0] // soll geklickt werden
inet.Document.All[5] // soll geklickt werden
dann müsste ich sowas machen:
while (inet.Document.Links[0]==Null) {
application.DoEvents();
}
inet.Document.Links[0].InvokeMember("Click");
while (inet.Document.All[5]==Null) {
application.DoEvents();
}
inet.Document.All[5].InvokeMember("Click");
oder so ähnlich.
genauso müssten ja dann meine arbeitsschritte aussehen.
das kann man doch sicher anders lösen.
vielleicht hast du jetzt nachdem du weisst was ich eigentlich erreichen will,
ja eine andere idee um das einigermassen gescheit zu bauen...
ich habe jetzt nicht alles ganz genau gelesen, aber ich verstehe überhaupt nicht, warum du hier für eine Hashtable (Dictionary) plädierst. Das ist doch ein klarer Fall für eine Queue, selbst wenn man den genauen Index kennt.
Hallo Nullpunkt,
ich komme auf meinen Vorschlag von oben zurück:
Zitat
Wenn du das eigentliche Objekt noch nicht hast, musst du einen Stellvertreter erzeugen und verwenden.
Du hattest ja auch schon sowas im Sinn.
Zitat
das nicht-existente objekt mit einem dummy zu referenzieren. und dann wenns existiert neu zu instanziieren.
Mach es einfach so. Das ist gut. Wobei ich es eben nicht Dummy nennen würde, sondern Stellvertreter. Das öffnet die Option, dass man auch für die Objekte, die man sofort erzeugen kann, Stellvertreter verwendet. Diese Stellvertreter können und sollten einen sinnvollen Namen bekommen, vielleicht sowas wie Arbeitsschritt.
okay, nur weiss ich nicht genau wie ich das mit den "stellvertreter" anstellen soll.
ich denke im kopf hab ichs schon zusammen, aber ich brings ned ins script.
die konkrete Lösung, also das "ins Script bringen" oder auch das ausprogrammieren, bleibt eine Aufgabe, die ich dir nicht abnehmen kann. Aber konkrete Fragen - und je konkreter desto besser - kann ich gerne beantworten.
Vielleicht kommen wir sogar ganz weg vom Stellvertreter hin zu einer (neuen) Klasse Arbeitsschritt, deren Objekte immer sofort erzeugt werden können, die aber ggf. erst später mit den für den jeweiligen Arbeitsschitt nötigen Informationen gefüllt werden.
alles klar..
ich wills ja grundsätzlich schon selber machen, und möchte
auch nicht das mir jemand etwas abnimmt.. aber ich habe schon soo viele
möglichkeiten probiert und sehe den wald nicht mehr vor lauter bäumen..
verstehst du? ich habe ehrlich gesagt keine ahnung in welche richtung ich gehen soll..
Original von herbivore
Vielleicht kommen wir sogar ganz weg vom Stellvertreter hin zu einer (neuen) Klasse Arbeitsschritt, deren Objekte immer sofort erzeugt werden können, die aber ggf. erst später mit den für den jeweiligen Arbeitsschitt nötigen Informationen gefüllt werden.
Das will ich meinen. Die ursprüngliche Frage an sich zeigt, dass das Modell dahinter schräg ist.