Toon posts:

[C#] Handige string methods

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het viel mij op dat er (jammer genoeg) de laatste tijd erg weinig C#-topics in dit forum te vinden zijn. :'( Daarom leek het mij aardig om een thread te beginnen met handige String-functies.

In de vele 'libraries' van .NET zijn natuurlijk vele handige stringfuncties in vele classes te vinden, zo is er bijvoorbeeld de StringBuilder-class voor het eenvoudig concateneren van strings of de RegEx voor reguliere expressies.

Ik ben echter van mening dat er nog wel wat aardige stringfuncties te verzinnen zijn. (Al is het alleen al om gewoon wat ervaring met C# op te doen... :))
Hier in de c-sharpcorner zijn enkele voorbeelden te vinden van wat ik bedoel en hieronder geef ik 2 voorbeelden van een Remove-method. (Voor de 'die-hards': Welke van de 2 is het meest gunstig qua performance of geheugengebruik? :))

Wie neemt deze uitdaging aan bij het verzinnen van handige, leuke of moeilijke stringfuncties?
:7

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public string Remove(string strValue, char[] characters)
{
   int intIndex;

   intIndex = strValue.IndexOfAny(characters);

   while (intIndex>=0)
   {
      // call the Remove-method of a string
      strValue = strValue.Remove(intIndex, 1);
      intIndex = strValue.IndexOfAny(characters);
   }

   return strValue
}

en:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public string Remove(string strValue, char[] characters)
{
   int intIndex;

   intIndex = strValue.IndexOfAny(characters);

   for(int i=0;i<characters.Length;i++)
   {
      strValue = strValue.Replace(new string(characters[i],1), "");
   }

   return strValue
}


PS. Jammer genoeg is de string-class sealed, maar dat betekent nog niet dat je niet zelf je eigen MyString-class kunt definieren en daarin de string-class kunt incapselen...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik weet niet of een c# string ook immutable zoals bij Java. Maar als hij immutable is, dan heb je wel erg langzame methodes omdat je bij iedere iteratie een nieuw string object loopt aan te maken.

Verwijderd

Topicstarter
c# strings zijn idd immutable :)

Heb je misschien een snellere methode dan?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

In java heb je een StringBuffer ik durf te wedden dat C# ook zoiets heeft. Ik zou daar dus even naar kijken.

Verwijderd

Alarmnummer schreef op 19 oktober 2002 @ 15:47:
In java heb je een StringBuffer ik durf te wedden dat C# ook zoiets heeft. Ik zou daar dus even naar kijken.
Die heet daar dus StringBuilder, daar heeft Puckly het al over gehad ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Sowieso zijn beide algoritmes fundamenteel inefficient; de efficiente methode is om karakters te kopieren naar een resultaat string(builder) als ze niet voorkomen in de lijst met te verwijderen karakters. In dat geval is de snelheid O( length(in)*length(remove) ), of als je remove eerst sorteert O( length(in) * log(length(remove)) ).

Algoritme 1 en 2 zijn allebei O( length(in)*length(in)*length(remove) ), zo te zien (mits length(in) >> length(remove) ). Het probleem is dat een karakter O( length(in) ) keer word opgeschoven, elke keer als een voorafgaand kaarkter wordt verwijderd. Door de input en de output niet te laten overlappen, hoeft elk karakter maximaal een keer te worden gekopieerd.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 19 oktober 2002 @ 18:29:
Sowieso zijn beide algoritmes fundamenteel inefficient
:) Da's eigenlijk ook precies de reden waarom ik juist deze 2 voorbeelden gaf. Ik had gehoopt op enkele mooie ;) alternatieven, zoals bijvoorbeeld:
C#:
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 string Remove(string strValue, char[] characters)
{
   StringBuilder aStringBuilder = new StringBuilder(strValue.Length);
   bool fAppend;
    
   for(int i=0;i<strValue.Length;i++)
   {
      fAppend = true;
      int intNumberOfChar = 0;
      while (fAppend==true && intNumberOfChar<characters.Length)
      {
         if (strValue[i] == characters[intNumberOfChar])
         {
            fAppend = false;
         }
         intNumberOfChar++;
      }
      if (fAppend)
      {
         aStringBuilder.Append(strValue[i]);
      }
  }
   return aStringBuilder.ToString();
}
Maar ok, wat vind je dan van dit voorbeeld om een string om te draaien?
C#:
1
2
3
4
5
6
7
8
9
10
11
public string Reverse(string strValue)
{
   char[] c = new char[strValue.Length];

   for(int i=0, j=strValue.Length-1;i<strValue.Length;i++,j--)
   {
      c[i] = strValue[j];   
   }

   return new string(c);
}

  • Marcelloz
  • Registratie: Juli 2002
  • Laatst online: 23-01 16:31

Marcelloz

IT dude with a beard

niet getest:
code:
1
2
3
4
5
6
7
8
9
10
public string Reverse(string strValue)
{
   int i=strValue.Length-1, j=0;
   char[] c = new char[i];
   
   for(;i>=0;)
      c[j++] = strValue[i--];   

   return new string(c);
}

There are better things in life than alcohol, but alcohol makes up for not having them.


  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 27-08 08:10
Waarschijnlijk omdat bij .NET een uitmuntende help functie aanwezig is (doet aan Delphi denken). Paul vind de remove toch wel leuk op mee te pikken.

Verwijderd

Ik heb ooit eens een videotje gezien over Performance en daar laten ze zien StringBuilder.Append tegen over string += string en daar kan je zien dat StringBuilder.Append stukke sneller is over grote hoeveelheden strings die toegevoegt moeten worden
ik heb hier het stukje code waar het over gaat ge copy-pasted

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String text = "Test ";
int repeat = 500;

static String TestString(String Text, int Repeat)
{
    String s = "";

    for (int i = 0; i < Repeat; i++)
    {
        s += Text;
    }

    return s;
}

static String TestStringBuilder(String Text, int Repeat)
{
    // Pre-allocate the memory necessary to store the string
    StringBuilder s = new StringBuilder("", Repeat * Text.Length);

    for (int i = 0; i < Repeat; i++)
    {
        s.Append(Text);
    }

    return s.ToString();
}


De show waar het over gaat is te bekijken op
http://msdn.microsoft.com/theshow/Episode027/default.asp
erg de moeite waard alleen sommige stukjes van de .net show zijn gewoon waardeloos zoals de interview met de presentator :S

grtz spiddy

Verwijderd

Topicstarter
stukke sneller is over grote hoeveelheden strings
Dit is idd wel een belangrijke opmerking :) want voor simpele string concats kun je qua performance nog wel steeds beter += gebruiken. Verder is een "nadeel" dat voor een StringBuilder-object meteen zo'n 4kB gealloceerd wordt.

Maar is er verder niemand die nog leuke C# code heeft liggen en die hier wil delen? :|

Verwijderd

Het zal inderdaad weinig performance verschil wezen als je het voor bijvoorbeeld 1 keer nodig is. het is denk juist het omgekeerde als je het voor 1 keer nodig heb omdat je eerste de stringbuilder moet aanmaken

  • nicemister
  • Registratie: Januari 2002
  • Laatst online: 19-05-2023

nicemister

Just b Nice

Bestaat er ook zoiets als bij PHP addslashes(). Maar dan in in C# ???

Sunny day


Verwijderd

bedoel je dit???

code:
1
string strUrl = @"http://www.tweakers.net";

  • nicemister
  • Registratie: Januari 2002
  • Laatst online: 19-05-2023

nicemister

Just b Nice

Bedankt voor je reactie....

hmm is wel vaag

code:
1
2
3
4
5
6
private string AddSlashes(string input){
    return @input;
}


string blah = AddSlashes(blah);



blah kan dus van alles zijn, maar ik heb het dus met die '@' geprobeert maar hij geeft nog steeds error. Ik wil namelijk de string in mijn sql-query gebruiken.

Sunny day


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Uit de .net docs:
@-quoted string literals start with @ and are enclosed in double quotation marks. For example:

@"good morning" // a string literal
The advantage of @-quoting is that escape sequences are not processed, which makes it easy to write, for example, a fully qualified file name:

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"
To include a double quotation mark in an @-quoted string, double it:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
Dat heeft er dus weinig mee te maken.

AddSlashes kun je maken door simpelweg ' door \' te vervangen e.d.

[ Voor 0% gewijzigd door marcusk op 23-10-2002 15:02 . Reden: bla++ ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
nicemister schreef op 23 oktober 2002 @ 14:57:
Bedankt voor je reactie....

hmm is wel vaag

code:
1
2
3
4
5
6
private string AddSlashes(string input){
    return @input;
}


string blah = AddSlashes(blah);



blah kan dus van alles zijn, maar ik heb het dus met die '@' geprobeert maar hij geeft nog steeds error. Ik wil namelijk de string in mijn sql-query gebruiken.


Gebruik gewoon parameters. Dan ben je van dat probleem af:
code:
1
2
3
4
5
6
7
8
SqlCommand cmdQuery = new SqlCommand ( ....);
cmdQuery.CommandText = "UPDATE tblTest SET Veld = @p_Waarde " +
                                            "WHERE tblTest.Id = @p_Id";
cmdQuery.Parameters.Add ( "@p_Waarde", SqlDbType.VarChar);
cmdQuery.Parameters.Add ( "@p_Id",          SqlDbtype.Int );
cmdQuery.Parameters["@p_Waarde"].Value = Edit1.Text;
cmdQuery.Parameters["@p_Id"].Value = 1;
...

https://fgheysels.github.io/


Verwijderd

Topicstarter
Verwijderd schreef op 23 oktober 2002 @ 13:31:
bedoel je dit???
code:
1
string strUrl = @"http://www.tweakers.net";
Zo'n string wordt in C(#) ook wel een 'verbatim string' genoemd.
whoami schreef op 23 oktober 2002 @ 15:05:
Gebruik gewoon parameters. Dan ben je van dat probleem af
Dat is idd nog de mooiste oplossing voor een sql-query.

Maar in andere gevallen kan een string2verbatim-functie uitkomst bieden... :)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Verwijderd schreef op 23 oktober 2002 @ 18:34:
Maar in andere gevallen kan een string2verbatim-functie uitkomst bieden... :)
een string2verbatim-functie, wat moet ik me daarbij voorstellen? :?

Zoals ik hierboven al duidelijk probeerde te maken is @"bla\bla" slechts een andere notatie voor "bla\\bla".

Verwijderd

Alarmnummer schreef op 19 oktober 2002 @ 15:45:
Ik weet niet of een c# string ook immutable zoals bij Java. Maar als hij immutable is, dan heb je wel erg langzame methodes omdat je bij iedere iteratie een nieuw string object loopt aan te maken.
Heheh, tiest hoor, B&D all the way. Dit topic laat wel weer zien waarom immutable strings een crime zijn: ze zijn of inefficient, of stringoperaties zijn onnodig lastig. En dat alleen maar omdat een paar theoretici nogal anaal doen over dat je strings (theoretisch) moet zien als atoms en niet als collections... Geef mij liever een werkbare (mutable) string, dan stop ik die theoretici wel in mijn pijp, want hun geblaat veroorzaakt alleen onnodige complexiteit. Die onnodige complexiteit zoek ik wel in mijn persoonlijke relaties, niet in mijn werk ;)

Verwijderd

Topicstarter
Verwijderd schreef op 23 oktober 2002 @ 19:48:
Heheh, tiest hoor, B&D all the way. Dit topic laat wel weer zien waarom immutable strings een crime zijn [...]
LOL :D
Ja, je hebt helemaal gelijk. Maar in C# kun je kiezen of je de immutable string of de mutable StringBuilder wilt gebruiken. De StringBuilder-class "represents a mutable string of characters".

Een string literal zoals "bla" of "http://www.tweakers.net" wordt meer gezien als een constante. Hoewel er wel weer een verschil is tussen een variabele van het type string en een constante van het type string... :)

Maar goed, voordat we in een theoretische discussie belanden (wat ook erg leuk kan zijn overigens), zal ik nog maar ff terugkomen op deze opmerking:
marcusk schreef op 23 oktober 2002 @ 19:09:
Zoals ik hierboven al duidelijk probeerde te maken is @"bla\bla" slechts een andere notatie voor "bla\\bla".
Ja, precies in beide gevallen gaat het om string literals, maar nicemister vroeg op 23 oktober of er in C# net zoiets bestaat als bij PHP: addSlashes().
Je zou dit kunnen opvatten als een verzoek om een soort van string2verbatim-functie. Aangezien ik deze thread begonnen was met het verzoek om handige string-functies, gaf ik die draai weer aan de discussie.

-- Misschien overbodig, maar nog even voor de duidelijkheid: string strValue1="bla\\bla" en string strValue2=@"bla\bla" is dus idd hetzelfde maar het "probleem" van nicemister was (volgens mij) dat hij juist string strValue3="bla\bla" wilde converteren naar een string waaraan de slashes waren toegevoegd en dat kan (uiteraard) niet door er een @ voor te zetten, omdat dat slechts werkt voor string literals en niet voor variabelen. :)

Verwijderd

Daarom vroeg ik ook of die dat wel bedoelde niet dus :p
Als die een webapplicatie aan het maken is kan je misschien
Server.HtmlEncode(string str);
gebruiken maar deze converteerd het naar html dus niet echt + \
misschien is het een tip om reguliere expressies te gebruiken :p
hoe dat werkt weet ik 1 2 3 niet

Verwijderd

Topicstarter
Nog maar wat code-ideeën dan maar... :)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public string ReplaceSQLWildcards(string strValue)
{
    StringBuilder aStringBuilder = new StringBuilder();
    aStringBuilder.Append(strValue);

    aStringBuilder = aStringBuilder.Replace("'", "''");
    aStringBuilder = aStringBuilder.Replace("%", "[%]");
    aStringBuilder = aStringBuilder.Replace("_", "[_]");
    aStringBuilder = aStringBuilder.Replace("[", "[[]");
    aStringBuilder = aStringBuilder.Replace("]", "[]]");

    return aStringBuilder.ToString();
}

public void AddSlashes(ref string strValue)
{
    StringBuilder aStringBuilder = new StringBuilder();
    aStringBuilder.Append(strValue);

    aStringBuilder = aStringBuilder.Replace("'", "\\'");
    aStringBuilder = aStringBuilder.Replace("\\", "\\\\");
    aStringBuilder = aStringBuilder.Replace("\"", "\\\"");

    strValue = aStringBuilder.ToString();
}

Verwijderd

effe een klein vraagje hoor
is de parameter van AddSlashe (ref string strValue) is dat in C++ hetzelfde als een pointer doorgeven dus like this
void AddSlashes(char *strValue) oid

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Verwijderd schreef op 24 oktober 2002 @ 21:27:
effe een klein vraagje hoor
is de parameter van AddSlashe (ref string strValue) is dat in C++ hetzelfde als een pointer doorgeven dus like this
void AddSlashes(char *strValue) oid


Een parameter met het keyword ref ervoor wil zeggen dat je de parameter by reference doorgeeft.
Je kunt het vergelijken met het
code:
1
void TestFunctie(int& getal);

in C++. Je kunt het idd in C++ ook doen met een pointer, maar references zijn in dit geval toch mooier.

(arrays worden in C++ zowiezo by reference gepassed in C++).

https://fgheysels.github.io/


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
oeps... ik blaatte onzin...

[ Voor 0% gewijzigd door marcusk op 24-10-2002 21:53 . Reden: hmmz ]


Verwijderd

whoami schreef op 24 oktober 2002 @ 21:34:

[...]


in C++. Je kunt het idd in C++ ook doen met een pointer, maar references zijn in dit geval toch mooier.

(arrays worden in C++ zowiezo by reference gepassed in C++).
ik snap wat je bedoelt
weer wat geleerd :)
ben de laatste tijd weer met C++ bezig maar heb nog steeds een hoop te leren na 1.5 jaar :S
Pagina: 1