Avatar billede mariendalsvej333 Nybegynder
11. juli 2012 - 12:38 Der er 12 kommentarer

ToAscii extension metode?

Hej med jer,

Jeg har siddet og bøvlet hele dagen med at få denne metode til at virke! Håber på hjælp... :-(

Metoden tager en tekst streng og replace Aa med Å, aa med å osv.
Jeg kan ikke bruge char da den kun repræsentere én karakter.
Laver derfor en characters varialbel, der er af typen char[] array.

Den returnere en tom streng?

public static string ToAscii(this string s)
{
StringBuilder sb = new StringBuilder();
char[] characters = s.ToCharArray();

for (int i = 0; i < characters.Length; i++)
{
  switch (characters.ToString())
  {
    case "Aa":
      sb.Append("Å");
      break;
    case "aa":
      sb.Append("å");
      break;
  }

return sb.ToString();
}           

Mvh Marianne
Avatar billede mbm2016 Nybegynder
11. juli 2012 - 12:50 #1
Hvorfor går du ikke blot således:

public static string ToAscii(string s)
{
    s=s.Replace("aa", "å");
    s=s.Replace("AA", "Å");
    return s;


Avatar billede mbm2016 Nybegynder
11. juli 2012 - 12:53 #2
eller lidt kortere:

public static string ToAscii(string s)
{
    return s.Replace("aa", "å").Replace("AA", "Å");
}

Avatar billede arne_v Ekspert
11. juli 2012 - 14:33 #3
Der var ihvertfald det nemmeste omend det ikke er saa effektivt med mange replacements.
Avatar billede janus_007 Nybegynder
11. juli 2012 - 20:50 #4
Funktionsnavnet er ihvertfald helt forkert, ved ToAscii forventer man at få ascii retur, men får istedet en string hvor Å er replacet med AA.

Hvad er det du gerne vil, måske der er en langt bedre løsning :)
Avatar billede mariendalsvej333 Nybegynder
11. juli 2012 - 21:25 #5
Hej med jer

tak for jeres forslag. Metode navnet er også ændret siden til FromAscii :-). Nogen bedre foreslag....

Det er til at lave pæne URL'er med og lave æøå om .

Jeg har en StringExtension klasse, hvor jeg har en metode som virker, da den løber en char c igennem og laver Å om til Aa.

Eks.:

public static string ToAscii(this string s, string replaceOldChar, string replaceNewChar, bool isToLower)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char c in s)
            {
                SpecialCharList(c, sb);

                if (replaceOldChar.Length > 0 && replaceNewChar.Length > 0)
                    sb.Replace(replaceOldChar, replaceNewChar);
            }
            if (isToLower)
                return sb.ToString().ToLower();

            return sb.ToString();
        }

public static void SpecialCharList(char c, StringBuilder sb)
        {
            switch (c)
            {
                case 'Å':
                    sb.Append("Aa");
                    break;
                case 'å':
                    sb.Append("aa");
                    break;
.........................

Den virker fint!

Så vil jeg lave en FromAscii, som laver Aa om til Å osv.

Men da char kun tager én karakter, er jeg lidt på den. Kan ikke finde en løsning på det som virker ihvertfald.

Kan jeg bruge noget af det jeg har lavet?
Avatar billede janus_007 Nybegynder
11. juli 2012 - 23:08 #6
Det har ikke så meget med ASCII at gøre, så navnet er stadig lidt underligt.
Anyway, så er der jo princippet med single responsibility 8http://www.remondo.net/solid-principles-csharp-single-responsibility/), nu ved jeg godt at den hører mere klasser til en funktioner, men jeg synes nu alligevel det er lidt overkill at lave  if (isToLower)
                return sb.ToString().ToLower();

når du altid har muligheden for dette efter du har kaldt funktionen. Personligt synes jeg det er irriterende at kalde en funktion som kan alle mulige ting og som er bloated med parameter input.

Men hvorfor bruger du ikke bare .Replace som mbm2007 foreslår?
Avatar billede mariendalsvej333 Nybegynder
12. juli 2012 - 00:24 #7
Hmmm... Janus_007 min ToAscii metode kunne måske blive Refactored lidt, men den gør præcis kun det jeg vil have den til.

Hvordan ville du Refactor den evt.?

Jeg har tilføjet et felt i DB tabel der hedder LoweredUriTopic.
Den indeholder de filtrede strenge til url. Eks.:

Da jeg fyldte år i søndags

bliver til:

da-jeg-fyldte-aar-i-soendags

Så kan jeg finde TitleID ude fra LoweredUriTopic.

Er det ikke den bedste måde at lave det på?
Avatar billede arne_v Ekspert
12. juli 2012 - 05:02 #8
Hvad med den helt simple:

    public class ASCIITransscription2
    {
        private static readonly string[] unic = { "Æ", "Ø", "Å", "æ", "ø", "å" };
        private static readonly string[] dkeq = { "Ae", "Oe", "Aa", "ae", "oe", "aa" };
        public static string ToASCII(string s)
        {
            string res = s;
            for(int i = 0; i < unic.Length; i++)
            {
                res = res.Replace(unic[i], dkeq[i]);
            }
            return res;
        }
        public static string FromASCII(string s)
        {
            string res = s;
            for(int i = 0; i < dkeq.Length; i++)
            {
                res = res.Replace(dkeq[i], unic[i]);
            }
            return res;
        }
    }

?
Avatar billede janus_007 Nybegynder
12. juli 2012 - 21:15 #9
Jeg ville nu ikke lave så meget i en funktion, men splitte det lidt mere op.

Anyway...
Men nu når du specifikt spørger til
"Da jeg fyldte år i søndags"
og det hele skal lowercases :)

Så ville jeg løse det sådan her:

var result = ReplaceDanishChars("Da jeg fyldte år i søndags");

string ReplaceDanishChars(string s)
{
  return s.ToLower()
              .Replace("æ", "ae")
              .Replace("å", "aa")
              .Replace("ø", "oe")
              .Replace(" ", "-");
}

Men i det hele taget er det jo meget svært sådan at skrive en funktion uden at kende den eksakte anvendelse. Der er flere måder det kan løses på og egentlig ikke noget "rigtig", det kommer an på så meget :)
Avatar billede mbm2016 Nybegynder
18. juli 2012 - 19:43 #10
Hehe først spørger du til hvordan man i en given streng erstatter alle ae,oe,aa med æ,ø,å... Så ligger jeg et svar som du tilsyneladende ignorerer i mere eller mindre grad og pludselig får vi flere detaljer om dit kodeprojekt, og du har nu fuldstændigt samme spørgsmål igen til hvordan man løser det at en char kun kan indeholde ét bogstav... Ydermere ser det nu også ud som om at du spørger ind til konverteringen fra æ,ø,å til ae,oe,aa ? Det vil sige det omvendte af hvad du startede med. Arne_v o Janus kommer også med nogle rigtig gode eksempler som ikke ser ud til at hjælpe. Kan du ikke være sød at præcisere dit problem? Det virker lidt som om du er en Programmør som gerne bare lige vil vise sin kode frem og hurtigt er igang med den næste :-) i al fald forvirrende for lille mig :)
Avatar billede mariendalsvej333 Nybegynder
07. august 2012 - 20:15 #11
arne_v og janus tak for jeres svar! Har været på ferie osv. og fik ikke givet point, inden jeg tog afsted. Vil i ikke skrive et svar så jeg kan give jer point?
Avatar billede arne_v Ekspert
28. august 2012 - 03:01 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester