Avatar billede mysitesolution Nybegynder
04. august 2005 - 01:10 Der er 16 kommentarer og
2 løsninger

Tælle tegn i C#

Hej...

Vil tælle hvor mange fx A´er der er i en streng... hhm... er der en lettere og bedre metode end at kører alle tegnene igennem, og så tælle op når et A bliver mødt?
Avatar billede mysitesolution Nybegynder
04. august 2005 - 02:48 #1
har lavet min egen:

    private int charCount(string input, char separator)
    {
        return input.Split(separator).Length-1;
    }

er sikkert ikke den hurtigste og bedste, men den virker ;)
Avatar billede Syska Mester
04. august 2005 - 08:55 #2
Kan jo ske der kommer andre, men måske det også kan gøres med Regular Expressions, men om det er hurtigere aner jeg ikke....

// ouT
Avatar billede Syska Mester
04. august 2005 - 09:02 #3
using System;
using System.Text.RegularExpressions;

class Class1
{
    static void Main(string[] args)
    {
        Regex myRegex = new Regex("e", RegexOptions.IgnoreCase);
        MatchCollection myCollection = myRegex.Matches("det her er en test");
        Console.WriteLine( myCollection.Count.ToString() );
    }
}

Det her virker og den er ikke Case Sensitive, måske du kan bruge det....
Avatar billede arne_v Ekspert
04. august 2005 - 20:33 #4
både Split og Regex er formentligt betydeligt langsommere end en banal for løkke

men som ved så meget andet så skal man tælle ufatteligt meget for at det
betyder noget
Avatar billede mysitesolution Nybegynder
10. august 2005 - 20:56 #5
arne_v->

Er det hurtigere at lave en for I til slutpåsætning
og så tjekke om char er det bestemte char? troede jeg ikke det var men...
Avatar billede arne_v Ekspert
10. august 2005 - 20:58 #6
jeg er sten sikker på at for løkken er hurtigere end regex
Avatar billede mysitesolution Nybegynder
10. august 2005 - 21:03 #7
ja men split tænker jeg mere på...
Avatar billede mysitesolution Nybegynder
10. august 2005 - 21:04 #8
du kan evt. ikke hjælpe mig i min tråd om crappy tråde vel?
Avatar billede arne_v Ekspert
10. august 2005 - 21:06 #9
for løkken er også hurtigere end Split
Avatar billede arne_v Ekspert
10. august 2005 - 21:07 #10
jeg har kigget lidt på det, men har ikke fundet en god løsning
Avatar billede mysitesolution Nybegynder
10. august 2005 - 21:09 #11
arne_v-> Okay, så laver jeg en ny funktion :)

Hmm, bare træls, det er jo fordi at der er while (true), eller while (!done) på... og hvis jeg så sætter done til true, så skal jeg reconnecte, for at den logger ud. Har så lyst halvdelen af det, ved at "smadre" listener, ved en close og en fejl meddelse...
Avatar billede arne_v Ekspert
10. august 2005 - 23:25 #12
jeg lavede lige et eksperiment
Avatar billede arne_v Ekspert
10. august 2005 - 23:25 #13
using System;
using System.Text.RegularExpressions;

namespace E
{
    public abstract class Test
    {
        private const int N = 1000000;
        private string name;
        public Test(string name)
        {
            this.name = name;
        }
        public abstract int CountChar(string s, char c);
        public void DoTest()
        {
            int nc = 0;
            long t1 = DateTime.Now.Ticks;
            for(int i = 0; i < N; i++)
            {
                nc = CountChar("Dette er en test", 'e');
            }
            long t2 = DateTime.Now.Ticks;
            Console.WriteLine(String.Format("{0,-15} : {1,10} ({2})", name, (t2 - t1), nc));
        }
    }
    public class TestForLoop : Test
    {
        public TestForLoop() : base("for loop")
        {
        }
        public override int CountChar(string s, char c)
        {
            int res = 0;
            for(int i = 0; i < s.Length; i++)
            {
                if(s[i] == c)
                {
                    res++;
                }
            }
            return res;
        }
    }
    public class TestSplit : Test
    {
        public TestSplit() : base("Split")
        {
        }
        public override int CountChar(string s, char c)
        {
            return (s.Split(c).Length - 1);
        }
    }
    public class TestRegex : Test
    {
        public TestRegex() : base("Regex")
        {
        }
        public override int CountChar(string s, char c)
        {
            Regex r = new Regex("" + c);
            return r.Matches(s).Count;
        }
    }
    public class TestRegexFixed : Test
    {
        private static Regex r = new Regex("e", RegexOptions.Compiled);
        public TestRegexFixed() : base("Regex fixed")
        {
        }
        public override int CountChar(string s, char c)
        {
            return r.Matches(s).Count;
        }
    }
    public class TestClass
    {
        public static void Main(string[] args)
        {
            (new TestForLoop()).DoTest();
            (new TestSplit()).DoTest();
            (new TestRegex()).DoTest();
            (new TestRegexFixed()).DoTest();
        }
    }
}
Avatar billede arne_v Ekspert
10. august 2005 - 23:25 #14
for loop        :    2343750 (5)
Split          :    9062500 (5)
Regex          :  90000000 (5)
Regex fixed    :  30937500 (5)
Avatar billede mysitesolution Nybegynder
11. august 2005 - 16:35 #15
tjaa så var for loop jo 4 gange så hurtigt hehe :/ takker
Avatar billede mysitesolution Nybegynder
11. august 2005 - 16:36 #16
opret svar
Avatar billede Syska Mester
11. august 2005 - 17:05 #17
Hvis du også henviser til mig ( for min lille del i starten ) kommer det her
Avatar billede arne_v Ekspert
11. august 2005 - 17:08 #18
jeg kom jo meget sent ind i spørgsmålet

men her er et svar fra mig
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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