Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

C#: String class erweitern oder andere Lösung?

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Smoerble
PostRank 5
PostRank 5
Beiträge: 201
Registriert: 18.05.2004, 09:12
Wohnort: bei München

Beitrag von Smoerble » 21.08.2004, 01:42

Hoi alle,
ich habe einen String, der einige Placeholder enthält. In einer Schleife ersetze ich die placeholder mit anderen Strings und setze das Ganze in einen StringBuilder. Derzeit sieht der Code etwa so aus:
-----------
.... loop start...
listCode.Append(forumTemplate.getLoopCode().Replace(
"[forumSubject]", forumSubject).Replace(
stringPlaceholderOne, oneTopic.getReplyCount().ToString()).Replace(
....
etliche weitere replacements
....
"[countViews]", oneTopic.getViewCount().ToString()).Replace(
"[lastPostAuthor]", oneTopic.getLastPostAuthorNick()).Replace(
"[lastPostDate]", oneTopic.getLastPostDateFormatted())
);
... loop end...
-----------

Es gibt dabei folgendes Problem:
Wenn die Variable "stringPlaceholderOne" leer ist (""), dann crasht string.Replace.
Also würde ich gerne so etwas Einfaches wie folgenden Code benutzen:
-----------
static public string replaceInString(string inString, string inFind, string inReplaceWith) {
if (inString.IndexOf(inFind) >= 0) {
return inString.Replace(inFind, inReplaceWith);
} else {
return inString;
}
}
-----------

Das Problem:
Ich müsste dazu immer wieder neue variablen setzten a la:
-----------
newString = replaceInString(newString, ....)
-----------
Das wird aber zu langsam durch die Schleife und die Masse der Replaces.
Daher überlege ich, ob man die string-class nicht einfach um eine eigene Methode erweitern kann?
Also dass string dann alle bisherigen Methoden hat sowie die obige neu dazu?

Wie macht man so etwas oder wie würdet Ihr das lösen (bitte denkt an die Geschwindigkeit!)?

Eigentlich ist es C#, aber da die Syntax zu Java fast gleich ist, hoffe ich, ihr könnt helfen, thx.
Cyall
Smo

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


HW
PostRank 8
PostRank 8
Beiträge: 761
Registriert: 04.04.2004, 08:00
Wohnort: Viersen

Beitrag von HW » 21.08.2004, 06:01

Daher überlege ich, ob man die string-class nicht einfach um eine eigene Methode erweitern kann?
SystemText.StringBuilder ist eine "Sealed" Class deshalb kannst Du sie nicht erweitern.

Irgendwie ist mir auch schleiherhaft warum Du mit diesen ganzen PalceHolder arbeitest.
Ist das so eine Art "Template"?

Wenn es Dir nur um den Inhalt des Placeholders geht.
Warum ersetzt Du die PlaceHolder nicht durch ein Literal-Control.

So richtig kann ich Dir nicht helfen, weil ich nicht genau verstanden habe wa Du machst.
Wenn Du bei jedem Seitenaufruf die Placeholder ersetzt halte ich das für keine gute Lösung. Da gibt es wesentlich elegantere Lösungen.

Mir scheint es, Du misbrauchst die PlaceHolder-Controls für Aufgaben, wozu sie nicht gedacht sind.

Also beschreib doch mal mit einfachen Worten was Du machst und warum und dann kann man überlegen ob es nicht eine ganz einfache Lösung für dein Problem gibt.
Ansonsten empfehle ich dir die Newsgoup
microsoft.public.de.german.entwickler.dotnet.asp

Übrigens ich arbeite auch mit asp.net und C#

mickey
PostRank 3
PostRank 3
Beiträge: 89
Registriert: 17.08.2004, 11:48
Wohnort: Hannover

Beitrag von mickey » 21.08.2004, 07:26

ich arbeite auch mit texten, in denen %placeholder% stecken. allerdings verwende ich dazu nicht den stringbuilder (große, mächtige klassen sind oft langsam), sondern regular expressions...

c#

Code: Alles auswählen

regexObj = new Regex("%(.*?)%", RegexOptions.IgnoreCase);
matchObj = regexObj.Match(sentenceText);
while(matchObj.Success) {
....
sentenceText = regexObj.Replace(sentenceText, replacement, 1);
....
matchObj = matchObj.NextMatch();
}
bei mir hat das jedenfalls einen performance-gewinn von mehreren 100% gebracht 8)

wenn du fragen hast, kannst du mir auch eine pn schicken.

Smoerble
PostRank 5
PostRank 5
Beiträge: 201
Registriert: 18.05.2004, 09:12
Wohnort: bei München

Beitrag von Smoerble » 21.08.2004, 15:23

@HW:
Die Seite setzt sich aus einem Set von Placeholdern zusammen, alles einfache Strings aus einer DB. Teilweise sind die Placeholder aber noch mit Variablen versehen, sodass ich f. ein Replace erstmal rausfinden muss, wie der komplette Placeholder heisst... und dabei kann es eben passieren, dass ein Placeholder gar nicht existiert.

Zeit ist nicht das Problem, natürlich wird der Kram nicht jedesmal komplett durchlaufen. Trotzdem ist es schlecht, wenn ein User u.U. 10 Sekunden auf das erste Rendern warten muss, andererseits will ich nach einem Reset o.ä. nicht alles "pre-rendern", daher dieser Lösungsansatz.
Warum ersetzt Du die PlaceHolder nicht durch ein Literal-Control.
Damit kann ich leider gar nichts anfangen ;)... was ist das / was meinst Du bitte?


@mickey:
Hmmm... wenn da sso viel ausmacht, sollte ich das auch 'mal testen, werde damit 'mal arbeiten.

@back at topic:
habe jetzt eine relativ schnelle Lösung gefunden, aber da jetzt über komplett andere Ansäötze geredet wird, würde ich gerne noch lernen, wie Ihr es generell besser machen würdet.

mickey
PostRank 3
PostRank 3
Beiträge: 89
Registriert: 17.08.2004, 11:48
Wohnort: Hannover

Beitrag von mickey » 21.08.2004, 15:52

Smoerble hat geschrieben: ... sodass ich f. ein Replace erstmal rausfinden muss, wie der komplette Placeholder heisst... und dabei kann es eben passieren, dass ein Placeholder gar nicht existiert....
nachtrag zu meinem beispiel:
die schleife wird ja nur so oft durchlaufen, wie es placeholder gibt. den namen des jeweiligen placeholders kannst du innerhalb der while-schleife folgendermaßen ermitteln...
c#

Code: Alles auswählen

placeholderName = matchObj.Groups[1].Value;
probier folgendes: bastel dir erst mal einen gesammt-string zusammen. darin enthalten keiner, einer oder mehrere %placeholder% (wobei der placeholder-name, also das wort zwischen den %, beliebig sein kann). mit dem oben gennanten beispiel kannst du dann höchst performant und dennoch unkompliziert in diesem string die einzelnen placeholder finden und ersetzen.

viel spaß mit regex :wink:

ps: in deinem fall ersetze alle % durch [ bzw ]

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 21.08.2004, 16:51

Bitte bei sowas im Titel doch bitte die Sprache angeben, ich hab das hier nun mal reineditiert. - Dankeschön.

HW
PostRank 8
PostRank 8
Beiträge: 761
Registriert: 04.04.2004, 08:00
Wohnort: Viersen

Beitrag von HW » 21.08.2004, 17:12

@Smoerble
..es gibt immer viele Wege die nach Rom führen.

Aber wenn Du nur Inhalte aus einer Datenbank an einer bestimmten Position unterbringen willst, dann ist das Literal-Control die richtige Wahl.
Du fügst an den gewünschten Stellen der ASPX-Datei die Literal-Controls ein und im Code-Behind, also der C#-Klasse weißt du den Controls dann den Inhalt aus der Datenbank zu.

Beispiel:
this.literal1.Text = "<p>" + Inhalt aus DB + </p>

Werte aus Variablen kannst Du ja im Code-Behind mit in diesem String einbauen.

Ich persönlich arbeite sehr viel mit XML und XSLT.
Positionen der Inhalte steuere ich über CSS (tabellenloses Design)

mickey
PostRank 3
PostRank 3
Beiträge: 89
Registriert: 17.08.2004, 11:48
Wohnort: Hannover

Beitrag von mickey » 21.08.2004, 20:18

HW hat geschrieben:Ich persönlich arbeite sehr viel mit XML und XSLT
im prinzip sehr zu empfehlen, wenn auch leider in .NET 1.1 ziemlich lahm.

Smoerble
PostRank 5
PostRank 5
Beiträge: 201
Registriert: 18.05.2004, 09:12
Wohnort: bei München

Beitrag von Smoerble » 21.08.2004, 21:49

@HW:
Achso, ok, verstehe. Nein, mein Ansatz ist, dass das _komplette_ Layout _jedes Elements_ in der Datenbank vorliegt. Man also das Design der Seite zu 100% ändern kann, ohne irgend einen Teil im aspx/cs zu ändern.

@Southmedia:
Ich hatte die Sprache extra weg gelassen, da es mehr um eine prinzipielle Vorgehensweise geht und die Syntax Java und C# bei solchen Standard-Geschichten nahezu identisch ist.

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 21.08.2004, 22:19

Ich kann keines von beidem :) Also bringts mir nix den Thread zu lesen. Und ich vermute ma 90% der Nutzer hier gehts gleich.

HW
PostRank 8
PostRank 8
Beiträge: 761
Registriert: 04.04.2004, 08:00
Wohnort: Viersen

Beitrag von HW » 22.08.2004, 06:46

@smoerble
deine Vorgehensweise alles neu zu erstellen ist sicherlich nicht effizient. Aber das muss jeder selbst wissen.

Um festzustellen, ob es dein PlaceHolder schon gibt, gibt es doch die Methode
Page.FindControl("ID")
Wenn es den da ist und du es nicht brauchst kannst Du es löschen und neu erstellen.

Außerdem geht es immer noch mit den LiteralControls. Du kannst doch den Quellcode einer kompletten HTML-Seite an einem LiteralControl hängen.

Aber wie gesagt, es gibt viele Wege nach Rom.

Mein Layout kann ich auch komplett ändern, indem ich einfach eine neue CSS-Datei anhänge.
Aber das ist eine ganz andere Philosophie.

@mickey
..ich bin mit der Geschwindigkeit von ASP.Net sehr zufrieden. Die ist deutlich schnelle als vergleichbare PHP-Seiten.

Außerdem gefällt mir die objektorientierte Programmierung in C# sehr gut.

mickey
PostRank 3
PostRank 3
Beiträge: 89
Registriert: 17.08.2004, 11:48
Wohnort: Hannover

Beitrag von mickey » 22.08.2004, 11:47

Smoerble hat geschrieben: Man also das Design der Seite zu 100% ändern kann, ohne irgend einen Teil im aspx/cs zu ändern.
das geht mit xml/xsl bzw table-less css auch :P
HW hat geschrieben: ..ich bin mit der Geschwindigkeit von ASP.Net sehr zufrieden. Die ist deutlich schnelle als vergleichbare PHP-Seiten.
ich bezog mich eigentlich speziell auf die performance von xml/xsl unter .NET 1.1. und sogar microsoft selbst gibt indirekt zu, dass sie da scheisse gebaut habe - die werbebotschaften für .NET 2 sind voll von ankündigungen, wie viel schneller das werden soll. :wink:
HW hat geschrieben: Außerdem gefällt mir die objektorientierte Programmierung in C# sehr gut.
DAS ist keine innovation und kein vorteil, den dir nur ASP.NET bieten würde. so was gabs schon, als die winzigweichen noch mit visual basic zu gange wahren... :roll:

ich habe zwar bisher so gut wie gar nichts mit aspx gemacht und kann es daher nicht wirklich beurteilen, aber so sachen wie "Page.FindControl(..)" sind garantierte performance-fresser - zumindest in der summe, und darum gehts ja hier. wieso sollte man also irgendwelchen ominösen monster-objekten die ganze arbeit überlassen (und sich damit völlig deren qualität bzw fehlerhaftigkeit) unterwerfen, wenn man mit ein paar relativ einfachen befehlen das selbe ziel effizient und performant erreichen kann?

HW
PostRank 8
PostRank 8
Beiträge: 761
Registriert: 04.04.2004, 08:00
Wohnort: Viersen

Beitrag von HW » 22.08.2004, 12:19

@mickey

..es steht doch wohl außer Frage, dass ich um eine Seite aus einer Datenbank zu generieren weder Regex brauche noch Controls generieren muss.

Beide Lösungen sind wenig effektiv.

Die Controls sind dazu gedacht um serverseitige Events auszulösen und regex ist hervorragend geeignet um User-Eingaben zu validieren.

mickey
PostRank 3
PostRank 3
Beiträge: 89
Registriert: 17.08.2004, 11:48
Wohnort: Hannover

Beitrag von mickey » 22.08.2004, 22:00

@HW ich will mich nicht streiten - programmier doch was du willst.
regex hat auf jeden fall viel mehr power als "bloß" usereingaben zu validieren...

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag