<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Performance</title>
        <link>http://geekswithblogs.net/akraus1/category/4777.aspx</link>
        <description>Performance</description>
        <language>en-US</language>
        <copyright>Alois Kraus</copyright>
        <managingEditor>akraus1@gmx.de</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Really Fast Formatting with Enterprise Library</title>
            <link>http://geekswithblogs.net/akraus1/archive/2008/01/14/118543.aspx</link>
            <description>&lt;p&gt;One of the action points for &lt;a href="http://www.codeplex.com/entlib/Wiki/View.aspx?title=EntLib4%20Backlog&amp;amp;referringTitle=Home"&gt;Enterprise Library 4&lt;/a&gt; is to improve the performance of the TextFormatter. I like performance problems and found some interesting results I would like to share here. TextFormatter does take a template where the placeholders are expanded for every log message. The template does look like this&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#ff8000"&gt;Timestamp:&lt;/font&gt; {timestamp} &lt;br /&gt;
&lt;font color="#ff8040"&gt;Message:&lt;/font&gt; {message} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Category:&lt;/font&gt; {category} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Priority:&lt;/font&gt; {priority} &lt;br /&gt;
&lt;font color="#ff8000"&gt;EventId:&lt;/font&gt; {eventid} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Severity:&lt;/font&gt; {severity} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Title:&lt;/font&gt;{title} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Machine: &lt;/font&gt;{machine} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Application Domain: &lt;/font&gt;{appDomain} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Process Id:&lt;/font&gt; {processId} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Process Name:&lt;/font&gt; {processName} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Win32 Thread Id:&lt;/font&gt; {win32ThreadId} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Thread Name:&lt;/font&gt; {threadName} &lt;br /&gt;
&lt;font color="#ff8000"&gt;Extended Properties:&lt;/font&gt; {dictionary({key} - {value} &lt;br /&gt;
)}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;TextFormatter does use StringBuilder to create from the template a mutable string and does then call StringBuilder.Replace for each token it could contain. It does basically a String.IndexOf to find if something has to be replaced and then allocates a new string which contains enough space for the token to be inserted. This process is repeated until all gaps are filled. This results in searches for tokens which are not present in the current template and some memory allocation/copy overhead because the string to replace will never have the same size.&lt;/p&gt;
&lt;p&gt;But the most expensive things are the TokenFunctions which do expand e.g. the Extended Properties collection at the end of the example template. A quick look into the source shows where the problem is:&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Format(StringBuilder messageBuilder, LogEntry log)&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new"&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;       ...&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; messageString = &lt;strong&gt;messageBuilder.ToString();&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;strong&gt;       ...&lt;/strong&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The performance optimization to use StringBuilder in the Formatter has cornered the TokenFunction formatter because it cannot to a simple replace of a fixed string and needs to parse the template. But StringBuilder gives you no access to the not yet constructed string and you need to use therefore this solution.&lt;/p&gt;
&lt;p&gt;Armed with this knowledge I came up with an alternate approach to format a text template which does not suffer from the deficiencies of StringBuilder.Replace. The trick is to simply use StringBuilder.Append. To be able to do this I split the template apart in its constant (marked in orange) parts and use for each dynamic content a retriever function. The tuple (string, callback) is put into an object (MicroFormatter) from which we can create a list that allows us to build up the expanded template step by step.  Registering template fill callbacks does eliminate all string searches and (nearly) all buffer reallocations. The cool thing is that this is also possible for the TokenFunctions which can now directly format the parsed template.&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; MicroFormatter&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Constant prefix which is part of the message template&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Prefix { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Gets the dynamic content of the LogEntry&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; Retriever { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; TokenFunction formatter wrapper function which does need a string template as parameter which is then formatted.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; The formatted string is then returned&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; TokenFuncRetriever { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Template which is expanded by the token e.g. "dictionary({key} - {value}" for the DictionaryFormatter&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; TokenFuncTemplate { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MicroFormatter()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MicroFormatter(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; prefix, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; tokenFuncTemplate, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; tokenFuncRetriver)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            Prefix = prefix;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            TokenFuncTemplate = tokenFuncTemplate;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            TokenFuncRetriever = tokenFuncRetriver;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MicroFormatter(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; prefix, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; retriever)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            Prefix = prefix;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            Retriever = retriever;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Appends to a StringBuilder instance the static and dynamic contents of the parsed template&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: gray"&gt;&lt;/span&gt;&lt;/p&gt;
           &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Format(LogEntry entry, StringBuilder template)
&lt;p&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (Prefix != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) &lt;span style="COLOR: green"&gt;// Append constant template part&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;font color="#ff0000"&gt;template.Append(Prefix);&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (Retriever != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) &lt;span style="COLOR: green"&gt;// Add dynamic content of LogEntry&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;font color="#ff0000"&gt;template.Append(Retriever(entry));&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (TokenFuncRetriever != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) &lt;span style="COLOR: green"&gt;// Or add dynamic content of TokenFunction&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;font color="#ff0000"&gt;template.Append(TokenFuncRetriever(entry, TokenFuncTemplate));&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;This allows us to generate a easy Format Method:&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new"&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: green"&gt;// Combined list of microformatters which allow an easy StringBuilder.Append instead of&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: green"&gt;// a much slower StringBuilder.Replace which does first search (many times pointless) and&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: green"&gt;// then replaces the string which needs to reallocate and copy the buffer&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    List&amp;lt;MicroFormatter&amp;gt; myFormatters = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; List&amp;lt;MicroFormatter&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Format(LogEntry entry)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// allocate string builder can be dynamically sized&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        StringBuilder sb = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; StringBuilder(500);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// Call formatters in sequence they were entered to build the spitted&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// template piece by piece together again.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (MicroFormatter fmt &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; myFormatters)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;           &lt;font color="#ff0000"&gt;fmt.Format(entry, sb);&lt;/font&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; sb.ToString();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The red lines are the important changes which give us much better performance. This simple solution does improve the formatting speed over 14 times! That should be enough for everyone ;-) Another costly part is the creation of the LogEntry itself which does call a private method in its default ctor (CollectIntrinsicProperties) which can cost quite some time. It would be nice if the P&amp;amp;P team would make this function virtual so one has a chance to optimize things a bit. This would be beneficial if somebody does want to filter LogEntry derived objects which can be filtered out without needing any of the other properties. That would allow to defer the costly data collection when it is really ensured that the entry will be logged.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;Performance&lt;/h3&gt;
&lt;p&gt;All Performance Tests were performed with an Intel Core Duo 6600 @ 2.40 GHz with 3 GB RAM, EntLib 3.1, VS2008 RTM and the message template which is shown at the start of the article.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="556" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="224"&gt;&lt;strong&gt;Test Case (executed 100K times)&lt;/strong&gt;&lt;/td&gt;
            &lt;td valign="top" width="185"&gt;&lt;strong&gt;Execution Frequency in 1/s&lt;/strong&gt;&lt;/td&gt;
            &lt;td valign="top" width="143"&gt;Speed Gain (x factor)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="223"&gt;Create LogEntry&lt;/td&gt;
            &lt;td valign="top" width="185"&gt;   22 000 &lt;/td&gt;
            &lt;td valign="top" width="143"&gt;-&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="222"&gt;Format LogEntry TextFormatter&lt;/td&gt;
            &lt;td valign="top" width="185"&gt;    5 300&lt;/td&gt;
            &lt;td valign="top" width="143"&gt;1&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="221"&gt;Format LogEntry SmartFormatter&lt;/td&gt;
            &lt;td valign="top" width="185"&gt;  75 000&lt;/td&gt;
            &lt;td valign="top" width="143"&gt;14&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;More Code&lt;/h3&gt;
&lt;p&gt;The complete code of my SmartFormatter is shown below:&lt;/p&gt;
&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;namespace&lt;/span&gt; Logging&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Really fast formatter with equivalent features as TextFormatter of the Enterprise Library&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; SmartFormatter : ILogFormatter&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;char&lt;/span&gt; TokenStartChar = &lt;span style="COLOR: #a31515"&gt;'{'&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; timeStampToken = &lt;span style="COLOR: #a31515"&gt;"{timestamp}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; messageToken = &lt;span style="COLOR: #a31515"&gt;"{message}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; categoryToken = &lt;span style="COLOR: #a31515"&gt;"{category}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; priorityToken = &lt;span style="COLOR: #a31515"&gt;"{priority}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; eventIdToken = &lt;span style="COLOR: #a31515"&gt;"{eventid}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; severityToken = &lt;span style="COLOR: #a31515"&gt;"{severity}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; titleToken = &lt;span style="COLOR: #a31515"&gt;"{title}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; errorMessagesToke = &lt;span style="COLOR: #a31515"&gt;"{errorMessages}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; machineToken = &lt;span style="COLOR: #a31515"&gt;"{machine}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; appDomainNameToken = &lt;span style="COLOR: #a31515"&gt;"{appDomain}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; processIdToken = &lt;span style="COLOR: #a31515"&gt;"{processId}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; processNameToken = &lt;span style="COLOR: #a31515"&gt;"{processName}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; threadNameToken = &lt;span style="COLOR: #a31515"&gt;"{threadName}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; win32ThreadIdToken = &lt;span style="COLOR: #a31515"&gt;"{win32ThreadId}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; activityidToken = &lt;span style="COLOR: #a31515"&gt;"{activity}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; NewLineToken = &lt;span style="COLOR: #a31515"&gt;"{newline}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; TabToken = &lt;span style="COLOR: #a31515"&gt;"{tab}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; DictionaryStartToken = &lt;span style="COLOR: #a31515"&gt;"{dictionary("&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; KeyValueStartToken = &lt;span style="COLOR: #a31515"&gt;"{keyvalue("&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; TimeStampStartToken = &lt;span style="COLOR: #a31515"&gt;"{timestamp("&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; ReflectedPropertyStartToken = &lt;span style="COLOR: #a31515"&gt;"{property("&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;const&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; EndToken = &lt;span style="COLOR: #a31515"&gt;")}"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Key is the Token template e.g. "{timestamp}" and value is a callback function that retrieves the requested string from&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; a LogEntry object.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; myTokenToFunc = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Key is the Token Function start e.g. "{dictionary(" and value is a callback function that formats from a&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; configured template the contents of a LogEntry object.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; myTokenFormatterToFunc = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, Func&amp;lt;LogEntry, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// Combined list of MicroFormatters which allow an easy StringBuilder.Append instead of&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// a much slower StringBuilder.Replace which does first search (many times pointless) and&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: green"&gt;// then replaces the string which needs to reallocate and copy the buffer&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;MicroFormatter&amp;gt; myFormatters = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;MicroFormatter&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; For brevity we use the C# 3.0 lambda syntax&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; AddWellknownTokens()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(timeStampToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.TimeStampString; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(messageToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.Message; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(categoryToken, FormatCategoriesCollection);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(priorityToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.Priority.ToString(); });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(eventIdToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.EventId.ToString(); });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(severityToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.Severity.ToString(); });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(titleToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.Title; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(errorMessagesToke, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.ErrorMessages; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(machineToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.MachineName; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(appDomainNameToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.AppDomainName; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(processIdToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.ProcessId; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(processNameToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.ProcessName; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(threadNameToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.ManagedThreadName; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(win32ThreadIdToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.Win32ThreadId; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(activityidToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; ent.ActivityId.ToString(); });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(NewLineToken, (LogEntry ent) =&amp;gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Environment&lt;/span&gt;.NewLine; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenToFunc.Add(TabToken, (LogEntry ent) =&amp;gt; {&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: #a31515"&gt;"\t"&lt;/span&gt;; });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// register token functions&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenFormatterToFunc.Add(DictionaryStartToken, (LogEntry ent, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template) =&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                DictionaryToken token = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DictionaryToken();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; token.FormatToken(template, ent);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenFormatterToFunc.Add(KeyValueStartToken, (LogEntry ent, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template) =&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    KeyValueToken token = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; KeyValueToken();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; token.FormatToken(template, ent);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenFormatterToFunc.Add(TimeStampStartToken, (LogEntry ent, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template) =&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    TimeStampToken token = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; TimeStampToken();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; token.FormatToken(template, ent);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            myTokenFormatterToFunc.Add(ReflectedPropertyStartToken, (LogEntry ent, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template) =&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    ReflectedPropertyToken token = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ReflectedPropertyToken();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; token.FormatToken(template, ent);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                });&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; SmartFormatter()&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {}&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; SmartFormatter(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            AddWellknownTokens();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            BuildFormatterList(template);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; Format(LogEntry entry)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// allocate string builder can be dynamically sized&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt;(500);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// Call formatters in sequence they were entered to build the splitted&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// template piece by piece together again.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (MicroFormatter fmt &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; myFormatters)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                fmt.Format(entry, sb);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; sb.ToString();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Returns the template in between the parentheses for a token function.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Expecting tokens in this format: {keyvalue(myKey1)}.&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param name="startPos"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Start index to search for the next token function.&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param name="message"&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Message template containing tokens.&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Inner template of the function.&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; GetInnerTemplate(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; tokenFuncStart, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; startPos, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; message)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; tokenStartPos = message.IndexOf(tokenFuncStart, startPos) + tokenFuncStart.Length;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; endPos = message.IndexOf(EndToken, tokenStartPos);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; message.Substring(tokenStartPos, endPos - tokenStartPos);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Parse the template and create the list of microformatters. This way we get an ordered list&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; of things we really have to do instead of trying to blindly format tokens in a template which&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; may not be present&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;param name="template"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;internal&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; BuildFormatterList(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; template)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            MicroFormatter fmt = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MicroFormatter();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;char&lt;/span&gt;&amp;gt; curNonTokenString = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;char&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; isTokenChar = &lt;span style="COLOR: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// Go through template and build list of Microformatters&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;for&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i = 0; i&amp;lt;template.Length; i++)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                isTokenChar = &lt;span style="COLOR: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (template[i] == TokenStartChar)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: green"&gt;// Transform all template variables &lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; token &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; myTokenToFunc.Keys)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (template.IndexOf(token, i) == i)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            i += token.Length-1;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            MicroFormatter formatter = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MicroFormatter();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            formatter.Prefix = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;(curNonTokenString.ToArray());&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: green"&gt;// Get for this token the callback function which retrieves&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: green"&gt;// from a LogEntry object the resulting dynamic string&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            formatter.Retriever = myTokenToFunc[token];&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            myFormatters.Add(formatter);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            isTokenChar = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            curNonTokenString.Clear();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: green"&gt;// Transform all Token functions in the message template&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; tokenStart &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; myTokenFormatterToFunc.Keys)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (template.IndexOf(tokenStart, i) == i)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; tokenTemplate = GetInnerTemplate(tokenStart,i, template);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            i += tokenStart.Length + tokenTemplate.Length + EndToken.Length - 1;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: green"&gt;// Create formatter for this token function and store the token function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: green"&gt;// template inside the formatter&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            MicroFormatter formatter = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MicroFormatter(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;(curNonTokenString.ToArray()),&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                                                                          tokenTemplate, &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                                                                          myTokenFormatterToFunc[tokenStart]);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            myFormatters.Add(formatter);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            isTokenChar = &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            curNonTokenString.Clear();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                            &lt;span style="COLOR: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: green"&gt;// if the current template character does not belong to a token variable or function&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: green"&gt;// store it later as constant template part in the next MicroFormatter instance&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (!isTokenChar)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    curNonTokenString.Add(template[i]);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: green"&gt;// the rest of the template is constant&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (curNonTokenString.Count != 0)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                myFormatters.Add( &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; MicroFormatter(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;(curNonTokenString.ToArray()), &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) );&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; FormatCategoriesCollection(LogEntry ent)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt; categoriesListBuilder = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; i = 0;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;String&lt;/span&gt; category &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; ent.Categories)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                categoriesListBuilder.Append(category);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (++i &amp;lt; ent.Categories.Count)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                    categoriesListBuilder.Append(&lt;span style="COLOR: #a31515"&gt;", "&lt;/span&gt;);&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;                }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; categoriesListBuilder.ToString();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;   }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118543"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118543" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/akraus1/aggbug/118543.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Alois Kraus</dc:creator>
            <guid>http://geekswithblogs.net/akraus1/archive/2008/01/14/118543.aspx</guid>
            <pubDate>Tue, 15 Jan 2008 00:18:46 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/akraus1/comments/118543.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/akraus1/archive/2008/01/14/118543.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/akraus1/comments/commentRss/118543.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/akraus1/services/trackbacks/118543.aspx</trackback:ping>
        </item>
    </channel>
</rss>