Diskuze: Odstranění diakritiky ze stringu - problém s iterací

C# .NET .NET (C# a Visual Basic) Odstranění diakritiky ze stringu - problém s iterací American English version English version

Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:

Ahojte, dělám si aplikaci, která po zadání nějakého řetězce s diakritikou jej změní na řetězec bez diakritiky. Dělám to jako konzolovou aplikaci, avšak ono řešení bych rád poté použil v ASP.NET MVC, kdy mi u linků vygeneruje hezkou URL.

Napsal jsem si jednoduchou třídu s jednoduchou metodou, která pomocí foreache prochází zadaný řetězec a porovnává jej s poli obsahující diakritiku. Najde-li shodu, nahradí znak.
V metodě main se cyklus nachází z toho důvodu, že v aplikaci v ASP.NET MVC, do které bych toto řešení v budoucnu rád aplikoval, je ve view foreach, který vypisuje jednotlivé záznamy a způsobuje mi to takový problém, že u první iterace se výsledek uloží do proměnné a s další iterací se přidávájí další řetězce. Viz

String-jedna
String-jednaString-dva
String-jednaString-dvaString-tri

Samozřejmě je to špatně. Níže přikládám svůj dosavadní kód. Děkuji za případné tipy, či pomoc. :)
Třída:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zkouska
{
    public class SeoToUrl
    {
        private string veta;
        private static string diakritika = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝßàáâãäåçèéêëìíîïñòóôõöùúûüýÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ";
        private static string neDiakritika = "AAAAAACEEEEIIIINOOOOOUUUUYsaaaaaaceeeeiiiinooooouuuuyyAaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiKkkLlLlLlLlLlNnNnNnNnNOoOoOoRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzs";
        private char[] diakritikaCharArray = diakritika.ToCharArray();
        private char[] neDiakritikaCharArray = neDiakritika.ToCharArray();

        public string OdstranDiakritiku(string retezec)
        {
            foreach (char znak in retezec)
            {
                if (diakritika.Contains(znak))
                {
                    for (int i = 0; i < diakritika.Length; i++)
                    {
                        if (znak.Equals(diakritikaCharArray[i]))
                        {
                            veta += neDiakritikaCharArray[i];
                        }
                    }
                }
                else
                {
                    veta += znak;
                }
            }

            veta = veta.Trim();
            veta = veta.Replace(" ", "-");
            veta = veta.Replace(",", "");
            veta = veta.Replace(".", "");

            return veta;
        }

    }
}

Main:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zkouska
{
    class Program
    {
        static void Main(string[] args)
        {
            SeoToUrl url = new SeoToUrl();

            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(url.OdstranDiakritiku("Programovací jazyk C, ty čabajko ěščřž"));
            }

                Console.ReadKey();
        }
    }
}

PS: Stále začínám a učím se.

Odpovědět 16.10.2015 20:30
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na vajkuba1234
patrik.valkovic:
foreach (char znak in retezec)
{
    if (diakritika.Contains(znak))
        veta += neDiakritika[diakritika.IndexOf(znak)];
    else
       veta += znak;
}
Jinak bych použil StringBuilder nebo pole char, ze kterého potom vygeneruješ string. Kvůli výkonu.
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 16.10.2015 20:42
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Hit
Člen
Avatar
Odpovídá na vajkuba1234
Hit:

Kdysi jsem v Javě řešil podobnou appku (akorát překládala soubory). Nevím jestli ti to pomůže, ale tady je kdyžtak moje řešení. http://www.itnetwork.cz/dev-lighter/643

Nahoru Odpovědět 16.10.2015 20:44
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vajkuba1234
Jan Vargovský:

První ti zkritizuji kód a pak teprv poradím :D

private static string diakritika = "...";
private static string neDiakritika = "...";
private char[] diakritikaCharArray = diakritika.ToCharArray();
private char[] neDiakritikaCharArray = neDiakritika.ToCharArray();

Chápu, že tam sereš statiku, abys ušetřil paměť, ale proč už nejsou statické ty ostatní věci? Moc nechápu ani důvod, proč si ukládat string jako další pole charů, když už to tak interně je.
buď si udělej jen:

private static string diakritika = "...";

a nebo jen

private char[] diakritikaCharArray = "...".ToCharArray();

ve výsledku je jedno jestli voláš diakritika[index] nebo diakritichaCha­rArray[index] :)

Wait, tvůj problém je jen ten, že musíš mít string veta zbytečně uložený na instanci a né jako proměnnou uvnitř metody? :D

 
Nahoru Odpovědět 16.10.2015 21:06
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vajkuba1234
Jan Vargovský:

Jinak nevím jestli chceš, aby tvůj kód byl výkonný nebo dobře čitelný, podle toho ti pak můžu dál poradit. Já osobně bych tohle ale nevynalézal sám a použil nějakou hotovou knihovnu třetí strany. Ale to je už na Tobě.

 
Nahoru Odpovědět 16.10.2015 21:30
Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:

Ahojte, super. Moc vsem dekuji prozatim za reakce. Jakmile se dostanu k PC, ihned na to kouknu a napisu. Moc Vam dekuji :-)

Nahoru Odpovědět 17.10.2015 23:11
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:

patrik.valkovic Dekuji. Uz mi to vubec nemyslelo a ja vedel, ze to mam zbytecne slozite. :D

Jan Vargovský Dekuji za pripominky, ruzne jsem experimentoval a hlavne mi to uz vubec nemyslelo, takze jsem postnul co jsem postnul. :D

Mi slo spise o tzv. Seo friendly URL, avsak jsem si onu metodu chtel prvne pripravit skrze konzolovou aplikaci. Vim, ze jsou na netu ruzna reseni, ale chtel jsem si to zkusit sam, jen tak pro srandu.

Milan Křepelka Ty jsi me inspiroval svym clankem na svem blogu, ktery je velice prinosny (alespon pro me). Pokud bys mel i jine navody, klidne pridavej. :) A chtel bych ti podekovat za ten link na aspnet.cz. :)

Nahoru Odpovědět 20.10.2015 19:32
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.