Strings in C#

  1. Inleiding
  2. String – ingebouwde methodes
  3. StringBuilder
  4. StringBuilder afzonderlijke regels
  5. String.Concat / StringBuilder.Append
  6. Slot
  7. Voorbeeldprogramma

Inleiding

Ook C# heeft strings, maar in tegenstelling tot het minuscule kledingstuk dat kan leiden tot opwindende situaties als bepaalde dames het dragen, is datgene wat een C# string kan hebben allesbehalve minuscuul want er kunnen maar liefst één miljard karakters in een string. In dit artikel een uitleg wat we in C# met strings kunnen doen.

up | down

String – ingebouwde methodes

Voor teksten (strings) hebben we een gegevenstype string en de string kan inmiddels heel veel karakters bevatten (één miljard karakters en in de toekomst wellicht meer). De string -type is zelf ook weer een klasse waarbij die klasse “out-of-the-box” een aantal methodes heeft. Een aantal methodes zijn: Contains(), StartsWith(), TrimStart(), EndsWith(), IndexOf(), SubString(), Replace() en Split(). Laten we eens kijken naar die ingebouwde methodes.

Op onze Windows computer hebben we een Excel bestand met daarin de prijzen van de tanga’s die deel uitmaken van onze spannende strandmode zomercollectie. In een string variabele vinden we de naam terug van het Excel bestand en de locatie van het bestand op onze Windows computer:

string volledigPad = 
@"C:\Mijn documenten\Strandmode\Prijslijst_Tanga's.xslx";

En we moeten al meteen “moeilijk” doen want de backslash \ is in C# een zogenaamd ontsnappingsteken waarbij het teken na de backslash een speciale betekenis heeft. In dit geval gaat het echter alleen maar om een simpel pad op een Windows computer. We hebben niks van doen met tekens met een speciale betekenis, maar Windows gebruikt wel die backslash voor het aangeven van haar paden. We kunnen voor deze situatie dan ook een zogenaamde verbatim string gebruiken die te herkennen is aan de @. Met de @ wordt de backslash als ontsnappingsteken genegeerd.

We doen drie dingen om erachter te komen wat de naam is van het Excel bestand. We gebruiken de ingebouwde methodes van de String gegevenstype en we beginnen met de .Replace()-methode. De backslash is nog steeds een ontsnappingsteken en we moeten twee backslashes gebruiken om aan te geven dat we in die string iets willen doen met de “\”. Deze willen we vervangen door een “;”:

volledigPad = volledigPad.Replace('\\', ';');

De String heeft ook een array-variant en we gebruiken de ingebouwde .Split()-methode om alles in een String array variabele te zetten:

string[] paden = volledigPad.Split(';');

Ten slotte halen we de naam van het bestand uit de string array. Let op de \r en de \n. De r en de n hebben nu wel een speciale betekenis. Er moet na de afgedrukte tekst namelijk een regeleinde met een line feed komen. Verder is ook de {0} de moeite van het vermelden waard. De {0} is een placeholder waar de waarde van een variabele wordt neergezet.

Console.WriteLine(
"Bestand {0} daar staat het in.\r\n",
 paden[paden.Length - 1]);

Het uiteindelijke resultaat is deze afgedrukte tekst:
Bestand Prijslijst_Tanga’s.xslx daar staat het in.

En we hebben twee ingebouwde methodes van de string gegevenstype gedemonstreerd. Allemaal “out-of-the-box” en gratis en voor niks…

up | down

StringBuilder

De StringBuilder kan ook gebruikt worden voor teksten. Een verschil met de StringBuilder is dat de string immutable is en de stringBuilder mutable.

Als je van een string-variabele de inhoud wilt wijzigen, dan wordt “onder water” een “nieuwe” string met dezelfde naam aangemaakt met daarin de gewijzigde inhoud. De “oude” string met de oorspronkelijke inhoud wordt vervolgens “weggegooid” en de garbage collector zal dan de geheugenruimte van het origineel vrijgeven. Met andere woorden, de String-klasse is immutable. De StringBuilder is in tegenstelling tot de string-klasse mutable. Dit houdt in dat voor wijzigingen de stringBuilder wel dezelfde geheugenruimte kan gebruiken waarmee de StringBuilder efficiënter omgaat met het geheugen.

Gebruik dan ook de StringBuilder als efficient / minimaal gebruik van het geheugen een vereiste is. Verder is bij intensieve stringbewerkingen de performance beter als je de StringBuilder gebruikt.

up | down

Afzonderlijke regels

Het geval kan zich voordoen dat stukjes tekst weggeschreven moeten worden als een aparte regel in een exportbestand. Als we de \r (Carriage Return) en de \n (Line Feed) gebruiken dan oogt het allemaal wel als zijnde aparte regels, maar het is nog steeds één regel met daarin karakters die een speciale betekenis hebben (de \r en \n).

Een voorbeeldje waarin we wat gaan doen met een string en een StringBuilder. We definiëren als volgt een List met strings en we zetten in die List wat namen van naaimachine fabrikanten:

IEnumerable<string> enumerabele = 
new List<string> { "Bernina", "Janome", "Pfaff" };

We gaan nu een StringBuilder variabele vullen vanuit de List. In de StringBuilder wordt de naam van elke afzonderlijke naaimachine fabrikant ook echt als een aparte regel geregistreerd:

StringBuilder stringBuilder = new StringBuilder();
foreach (string tekst in enumerabele) 
{
  stringBuilder.AppendLine(tekst);
}

De StringReader is ook een klasse en die kunnen we gebruiken om de StringBuilder-variabele uit te lezen. De .Peek() methode van de StringReader zorgt ervoor dat de stringReader-variabele wordt uitgelezen totdat het einde van de tekst is bereikt. En we zien zo de namen van de naaimachine fabrikanten als afzonderlijke regels verschijnen:

StringReader stringReader = 
new StringReader(stringBuilder.ToString());
string regel = null;
while (stringReader.Peek() > -1)
{
  regel = stringReader.ReadLine();
  Console.WriteLine(regel);
}

up | down

String.Concat() en StringBuilder.Append()

Aparte strings kun je samenvoegen tot één string en veel programmeertalen gebruiken daarvoor de term Concatenatie (in het Engels: Concatenate). Veel standaard functies die strings samenvoegen hebben dan ook namen als Concat of Conc.

Een voorbeeldje waarin we strings in een string array variabele met een string en een StringBuilder gaan samenvoegen. We definiëren een string array en daar zetten we de namen in van drie Japanse motorfiets fabrikanten:

string[] stringArray = 
{ "Honda", "Kawasaki", "Suzuki"};

We gaan met standaard functie .Concat() concateneren:

string stringVariabele = 
String.Concat(stringArray[0],
              stringArray[1],
              stringArray[2]);

En we gaan met de StringBuilder concateneren:

StringBuilder stringBuilderAppend = 
new StringBuilder();
for (int i = 0; 
     i < stringArray.Length; 
     i++) 
     { stringBuilderAppend.Append(stringArray[i]); }

En we zien dat de StringBuilder.Append wat flexibeler is dan de String.Concat. Bij de StringBuilder.Append hoeven we niet van te voren in de code aan te geven dat het om drie elementen gaat. De StringBuilder.Append blijft net zolang alle substrings uit die string array aan elkaar plakken totdat het einde van de string array is bereikt.

up | down

Slot

In deze post heb ik laten zien dat je de gegevenstypes String en StringBuilder kunt gebruiken voor de (tijdelijke) opslag van heel veel karakters (teksten). Weliswaar minder opwindend dan het gelijknamige kledingstuk dat dames wel eens dragen, maar het zijn toch twee gegevenstypes met veel potentieel.

Zowel de String als de StringBuilder zijn klassen en die klassen hebben out-of-the-box allerlei ingebouwde methodes. Het verdient de aanbeveling om te kijken welke ingebouwde methodes er zijn zodat je het wiel niet opnieuw hoeft uit te vinden omdat dat wiel er al is. Voor de opslag van heel veel karakters (teksten) kun je zowel de String als de StringBuilder gebruiken, maar de StringBuilder is “onder de motorkap” toch wat krachtiger zodat in de meeste gevallen het gebruik van de StringBuilder de voorkeur verdient.

Ben ik er in geslaagd je aandacht vast te houden tot het einde van dit artikel? Fijn! Hopelijk ben je met deze posting weer wat wijzer geworden en ik hoop je weer terug te zien in één van mijn volgende blog posts. Wil je weten wat ik nog meer over C# heb geschreven? Hit the C# button…

up | down


Voorbeeldprogramma

using System;
using System.Text;
using System.Collections.Generic;
using System.IO;

namespace StringBuilderWriterReader2
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      string volledigPad = 
      @"C:\Mijn documenten\Strandmode\Prijslijst_Tanga's.xslx";
      
      // Vervangen van de backslash
      volledigPad = volledigPad.Replace('\\', ';');
      
      // Splitsen
      string[] paden = volledigPad.Split(';');
      
      // Het laatste element pakken
      Console.WriteLine("Bestand {0} daar staat het in.\r\n",
      paden[paden.Length - 1]);
      
      // Collecties
      string[] stringArray = 
      { "Honda", "Kawasaki", "Suzuki"};

      IEnumerable<string> enumerabele = 
      new List<string> { "Bernina", "Janome", "Pfaff" };
       
      // StringBuilder - vullen
      Console.WriteLine(
      "We instantieren een StringBuilder()");
      StringBuilder stringBuilder = new StringBuilder();
      foreach (string tekst in enumerabele) 
      {
         Console.WriteLine(
         "- regel toevoegen aan de StringBuilder 
            met .AppendLine():" + tekst);
         stringBuilder.AppendLine(tekst);
      }
       
      // StringBuilder - uitlezen
      Console.WriteLine(
      "\r\nMet StringReader de StringBuilder uitlezen, 
      parsen naar verschillende regels:");
      StringReader stringReader = 
      new StringReader(stringBuilder.ToString());
      string regel = null;
      while (stringReader.Peek() > -1)
      {
        regel = stringReader.ReadLine();
        Console.WriteLine(regel);
      }
        
      // StringArray vullen 
      Console.WriteLine(
      "\r\nstringArray heeft de volgende inhoud:");
      for (int i = 0; i < stringArray.Length; i++) 
      { Console.WriteLine(stringArray[i]);}
                 
      // String.Concat()
      Console.WriteLine(
      "\r\nConcatenatie met String.Concat():");
      string stringVariabele = 
      String.Concat(stringArray[0],
                    stringArray[1],
                    stringArray[2]);
      Console.WriteLine(stringVariabele);

      // StringBuilder.Append()
      Console.WriteLine(
      "\r\nConcatenatie met StringBuilder.Append():");
      StringBuilder stringBuilderAppend = 
      new StringBuilder();
      for (int i = 0; i < stringArray.Length; i++) { 
           stringBuilderAppend.Append(stringArray[i]); }
           Console.WriteLine(stringBuilderAppend);
      }
   }
}

up

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *