Toon posts:

[C#][ASP.NET] Parameterswitch binnen functie werkt niet?

Pagina: 1
Acties:
  • 51 views sinds 30-01-2008

Verwijderd

Topicstarter
Hi,

Ik had vanmiddag ff een functie gemaakt die textboxjes controleert op hun invoer.
Nu wil het dat "Nummeriek" als sType wel werkt, maar de anderen niet.
Ik zie het even niet dus wie verklapt het.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    public class CheckField
    {
        public int iAantalCharsGoed;
        public char[] arrayTekens;

        public bool Is(string txtTextbox, string sType)
        {
            char[] arrayTextbox = txtTextbox.ToCharArray();

            string sAlfabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string sNummeriek = "0123456789";
            string sEmail = "@_."+sAlfabet+sNummeriek;
            string sAll = sAlfabet+sNummeriek+sEmail;

            switch(sType)
            {
                case "Nummeriek": 
                    arrayTekens = sNummeriek.ToCharArray();
                    break;
                case "Alfabet": 
                    arrayTekens = sAlfabet.ToCharArray();
                    break;
                case "Email": 
                    arrayTekens = sEmail.ToCharArray();
                    break;
                case "All": 
                    arrayTekens = sAll.ToCharArray();
                    break;
            }
                
            for(int i=0; i < arrayTextbox.Length; i++)
            {
                for(int j=0; j < arrayTekens.Length; j++)
                {
                    if(arrayTextbox[i].ToString() == arrayTekens[j].ToString())
                    {
                        iAantalCharsGoed += 1;
                    }
                }
            }

            if(iAantalCharsGoed.ToString() == txtTextbox.Length.ToString())
            {
                // alle chars voldeden aan de waarde
                return true;
            }
            else
            {
                return false;
            }

        }
    }

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Werkten switches niet alleen met enumerations en integers?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:42
Ik kan nou niet helemaal volgen wat er nou fout gaat, en waar het fout gaat. Wat gaat er volgens jou nu niet goed dan?

Wat ik wel weet is dat je deze functionaliteit veel handiger en gemakkelijk kan implementeren door bijvoorbeeld gebruik te maken van Regular Expression's.
kenneth schreef op woensdag 25 januari 2006 @ 19:58:
Werkten switches niet alleen met enumerations en integers?
Nope, zie hiervoor de C# specs over het switch-statement.

[ Voor 40% gewijzigd door Sybr_E-N op 25-01-2006 20:05 ]


Verwijderd

Topicstarter
Test 'm eens als je wil dan, ik heb het nu in een nieuw projectje geprobeerd en als ik een tekstbox check op nummeriek werkt het wel en op alfabet etc niet. (ik doe ff een response.rewrite("werkt"); om het te testen of een veld goed is of niet)

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:42
Waar komt sType vandaan?

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 18:31
Ik zou het al zeker niet met strings oplossen, maar gebruik maken van enums.

code:
1
2
3
4
5
6
7
public enum CheckFieldType
{
    Numeriek
    ,Alfabetical
    ,Email
    ,All
}


Dan kun je in plaats van string als parameter door te genven CheckFieldType als parameter doorgeven. Vervolgens is het in je swith het volgende


code:
1
2
3
4
5
swith (checkFieldTypeParam)
{
    case CheckFieldType.Alfabetical:
    .....
}



Verder zou ik toch iets anders verzinnen met die validatie. Loopen over de hele string en dan nog eens over de array is niet bepaald snel te noemen.

Zoek eens op reguliere expressies! Ik denk dat het een pak sneller gaat.
iAantalCharsGoed.ToString() == txtTextbox.Length.ToString()
Je kan ook integers met elkaar vergelijken
iAantalCharsGoed == txtTextbox.Length

[ Voor 11% gewijzigd door Vedett. op 25-01-2006 20:09 ]


  • Juicy
  • Registratie: December 2000
  • Laatst online: 15-04 05:23
Ik heb de volgende opmerkingen:

1) Ik begrijp niet waarom je een string meegeeft ipv een enum om aan te geven op welke manier je de validiteit wil checken.
2) De manier waarop je kijkt of een karakter voorkomt in de door jouw gestelde strings is niet echt efficient. Daar heb je betere methoden voor. Kijk eens naar de methods van de String.
3) Het checken op numeriek, alphanumeriek etc kan ook weer efficienter dan de door jouw gehanteerde methode. Zoek eens mbv Google.

-


Verwijderd

Topicstarter
Vedett. schreef op woensdag 25 januari 2006 @ 20:06:
Ik zou het al zeker niet met strings oplossen, maar gebruik maken van enums.

code:
1
2
3
4
5
6
7
public enum CheckFieldType
{
    Numeriek
    ,Alfabetical
    ,Email
    ,All
}


Dan kun je in plaats van string als parameter door te genven CheckFieldType als parameter doorgeven. Vervolgens is het in je swith het volgende


code:
1
2
3
4
5
swith (checkFieldTypeParam)
{
    case CheckFieldType.Alfabetical:
    .....
}
Dat is zeker een mooie oplossing, maar voorlopig houd ik m'n functie aanroeping op deze manier.
Als het werkt kijk ik er wel naar ;)
Verder zou ik toch iets anders verzinnen met die validatie. Loopen over de hele string en dan nog eens over de array is niet bepaald snel te noemen.

Zoek eens op reguliere expressies! Ik denk dat het een pak sneller gaat.
Ik moet je eerlijk zeggen dat ik met reguliere expressies alleen bepaalde gedeeltes check, als ik op elke char een regexp moet doen gaat dat volgens mij uber traag. Om het iig ff te verwezenlijken heb ik de code in de OP gemaakt.
Die geef ik mee als parameter.

Verwijderd

Topicstarter
Juicy schreef op woensdag 25 januari 2006 @ 20:11:
Ik heb de volgende opmerkingen:

1) Ik begrijp niet waarom je een string meegeeft ipv een enum om aan te geven op welke manier je de validiteit wil checken.
2) De manier waarop je kijkt of een karakter voorkomt in de door jouw gestelde strings is niet echt efficient. Daar heb je betere methoden voor. Kijk eens naar de methods van de String.
3) Het checken op numeriek, alphanumeriek etc kan ook weer efficienter dan de door jouw gehanteerde methode. Zoek eens mbv Google.
Oftewel je weet het ook niet?
Dat gemekker over hoe ik iets volgens jullie zou moeten oplossen...

/edit
Ik maak dit voor een schoolopdracht en vind het gewoon leuk zo'n checkertje te maken.

[ Voor 7% gewijzigd door Verwijderd op 25-01-2006 20:16 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22:07

NMe

Quia Ego Sic Dico.

Zo werkt het hier niet. :) Wij gaan niet jouw code voor je debuggen, dat mag je zelf doen. Daarnaast geef je inderdaad wel erg weinig informatie in je startpost over wat er misgaat en waarom dat fout is. Iets uitgebreider zijn kan geen kwaad. ;) Zie ook de "quickstart".
Verwijderd schreef op woensdag 25 januari 2006 @ 20:13:
Oftewel je weet het ook niet?
Dat gemekker over hoe ik iets volgens jullie zou moeten oplossen...
Iets minder aangebrand reageren op goedbedoeld commentaar mag ook wel hoor. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Oftewel je weet het ook niet?
Dat gemekker over hoe ik iets volgens jullie zou moeten oplossen...
Leuk hé die mannen die het altijd weer beter weten. Vergeet je de lowercase letters niet. Ik zie alleen maar de uppercase letters en je doet nergens een conversie naar hoofdletters.

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 18:31
Verwijderd schreef op woensdag 25 januari 2006 @ 20:13:
[...]
Oftewel je weet het ook niet?
Dat gemekker over hoe ik iets volgens jullie zou moeten oplossen...
Tja, bedankt en de kost :? Iets in mij zegt dat ik niet zoveel moeite had moeten doen.
Ik moet je eerlijk zeggen dat ik met reguliere expressies alleen bepaalde gedeeltes check, als ik op elke char een regexp moet doen gaat dat volgens mij uber traag. Om het iig ff te verwezenlijken heb ik de code in de OP gemaakt.
Uber traag?? Ik heb eens eventjes een testje ineen geflanst. Een keer 1000 keer de waarden van de checkbox met uw class gecontroleerd, 1 keer met een aangepaste class;
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public enum CheckFieldType
    {
        Alfabetical
        ,Numeric
        ,Email
        ,All
    }

    public class CheckFieldRegEx
    {
        public bool Is(string txtTextbox, CheckFieldType sType)
        {

            Regex expression = null;
            string sAlfabet = "[A-Za-z]";
            string sNummeriek = "[0-9]";
            string sEmail = @"\b[A-Z0-9._%-]+@[A-Z0-9-]+\.[A-Z]{2,4}\b";
            string sAll = sAlfabet + sNummeriek + "[@_.]";

            switch (sType)
            {
                case CheckFieldType.Alfabetical:
                    expression = new Regex(sAlfabet);
                    break;
                case CheckFieldType.Numeric:
                    expression = new Regex(sNummeriek);
                    break;
                case CheckFieldType.Email:
                    expression = new Regex(sEmail);
                    break;
                case CheckFieldType.All:
                    expression = new Regex(sAll);
                    break;

            }

            return expression.IsMatch(txtTextbox);
        }
    }


//Aanroepen van de code

private void button1_Click(object sender, EventArgs e)
        {
            DateTime startDt = DateTime.Now;
            TimeSpan span;

            CheckFieldLoop checkFieldLoop = new CheckFieldLoop();
            for (int i = 0; i < 1000; i++)
            {
                checkFieldLoop.Is(textBox1.Text, "Nummeriek");
                checkFieldLoop.Is(textBox1.Text, "Alfabet");
                checkFieldLoop.Is(textBox1.Text, "Email");
                checkFieldLoop.Is(textBox1.Text, "All");
            }

            span = DateTime.Now - startDt;
            Console.WriteLine("checking fields using loop took : " + span.Milliseconds);


            startDt = DateTime.Now;

            CheckFieldRegEx checkFieldRegex = new CheckFieldRegEx();
            for (int i = 0; i < 1000; i++)
            {
                checkFieldRegex.Is(textBox1.Text, CheckFieldType.Numeric);
                checkFieldRegex.Is(textBox1.Text, CheckFieldType.Alfabetical);
                checkFieldRegex.Is(textBox1.Text, CheckFieldType.Email);
                checkFieldRegex.Is(textBox1.Text, CheckFieldType.Numeric);
            }

            span = DateTime.Now - startDt;
            Console.WriteLine("checking fields using regex took : " + span.Milliseconds);
        }


resultaat:
eerste test:
input string is "test"
Resultaat in milliseconden:
checking fields using loop took : 406
checking fields using regex took : 421

twede test:
input string is mijn e-mail adres (naam.voornaam @pandora.be)
Resultaat in milliseconden:
checking fields using loop took : 781
checking fields using regex took : 437

derdetest:
input string variabele karakters met totale lengte van 50
Resultaat in milliseconden:
checking fields using loop took : 937
checking fields using regex took : 468


Dus: Als je een tekst met de lengte van een normaal é-mail adres moet checken, ben je twee keer zo snel af met reguliere expressies.

Je moet nog wel zelf de reguliere expressies testen. Dat heb ik niet gedaan, maar zal het testresultaat zeker niet beïnvloeden

[ Voor 24% gewijzigd door Vedett. op 25-01-2006 20:45 ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 25 januari 2006 @ 20:36:
[...]


Leuk hé die mannen die het altijd weer beter weten. Vergeet je de lowercase letters niet. Ik zie alleen maar de uppercase letters en je doet nergens een conversie naar hoofdletters.
Hey thnx! ik was er anders idd weer te makkelijk vanaf gekomen ;)

Verwijderd

Topicstarter
Vedett. schreef op woensdag 25 januari 2006 @ 20:43:
[...]


Tja, bedankt en de kost :? Iets in mij zegt dat ik niet zoveel moeite had moeten doen.

[...]


Uber traag?? Ik heb eens eventjes een testje ineen geflanst. Een keer 1000 keer de waarden van de checkbox met uw class gecontroleerd, 1 keer met een aangepaste class;
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public enum CheckFieldType
    {
        Alfabetical
        ,Numeric
        ,Email
        ,All
    }

    public class CheckFieldRegEx
    {
        public bool Is(string txtTextbox, CheckFieldType sType)
        {

            Regex expression = null;
            string sAlfabet = "[A-Za-z]";
            string sNummeriek = "[0-9]";
            string sEmail = @"\b[A-Z0-9._%-]+@[A-Z0-9-]+\.[A-Z]{2,4}\b";
            string sAll = sAlfabet + sNummeriek + "[@_.]";

            switch (sType)
            {
                case CheckFieldType.Alfabetical:
                    expression = new Regex(sAlfabet);
                    break;
                case CheckFieldType.Numeric:
                    expression = new Regex(sNummeriek);
                    break;
                case CheckFieldType.Email:
                    expression = new Regex(sEmail);
                    break;
                case CheckFieldType.All:
                    expression = new Regex(sAll);
                    break;

            }

            return expression.IsMatch(txtTextbox);
        }
    }


resultaat:
eerste test:
input string is "test"
Resultaat in milliseconden:
checking fields using loop took : 406
checking fields using regex took : 421

twede test:
input string is mijn e-mail adres (naam.voornaam @pandora.be)
Resultaat in milliseconden:
checking fields using loop took : 781
checking fields using regex took : 437

derdetest:
input string variabele karakters met totale lengte van 50
Resultaat in milliseconden:
checking fields using loop took : 937
checking fields using regex took : 468


Dus: Als je een tekst met de lengte van een normaal é-mail adres moet checken, ben je twee keer zo snel af met reguliere expressies.

Je moet nog wel zelf de reguliere expressies testen. Dat heb ik niet gedaan, maar zal het testresultaat zeker niet beïnvloeden
Bedankt voor het showen, erg interessant om te weten.
Maar mijn class werkte dus wel bij jou? Ook alfabet ;)

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 18:31
Werkte inderdaad.

Zet toch maar Enums, die zijn namelijk type safe.

Maarja, wie ben ik om te zeggen wat je moet doen :9

[ Voor 79% gewijzigd door Vedett. op 25-01-2006 20:54 ]


Verwijderd

Topicstarter
Vedett. schreef op woensdag 25 januari 2006 @ 20:53:
Werkte inderdaad.

Zet toch maar Enums, die zijn namelijk type safe.

Maarja, wie ben ik om te zeggen wat je moet doen :9
Thnx for the tip ;) ik ga het zo proberen, vind het idd ook duidelijker met aanroepen.

Verwijderd

Dus: Als je een tekst met de lengte van een normaal é-mail adres moet checken, ben je twee keer zo snel af met reguliere expressies.

Je moet nog wel zelf de reguliere expressies testen. Dat heb ik niet gedaan, maar zal het testresultaat zeker niet beïnvloeden
Tjesus, wat is die RegEx toch geil. Kijk hier eens om je regular expressies te testen.

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:42
Verwijderd schreef op woensdag 25 januari 2006 @ 20:57:
[...]

Tjesus, wat is die RegEx toch geil. Kijk hier eens om je regular expressies te testen.
offtopic:
En als je helemaal lui wilt zijn kijk dan eens naar Expresso.

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 07-04 15:45

dotcode

///\00/\\

niet echt gek dat de regex sneller is als je allemaal sting comares gaat zitten doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            for(int i=0; i < arrayTextbox.Length; i++) 
            { 
                for(int j=0; j < arrayTekens.Length; j++) 
                { 
                    if(arrayTextbox[i].ToString() == arrayTekens[j].ToString()) 
                    { 
                        iAantalCharsGoed += 1; 
                    } 
                } 
            } 

            if(iAantalCharsGoed.ToString() == txtTextbox.Length.ToString()) 
            { 
                // alle chars voldeden aan de waarde 
                return true; 
            } 
            else 
            { 
                return false; 
            }

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool bFound;
            for(int i=0; i < arrayTextbox.Length; i++) 
            { 
                      bFound = false;
                for(int j=0; j < arrayTekens.Length; j++) 
                { 
                    if(arrayTextbox[i] == arrayTekens[j]) 
                    { 
                      bFound = true;
                      continue;
                    }
                }
                if (!bFound)
                { 
                  return false;
                }
            } 
return true;


Anyway deze implementatie is iets sneller, maar ik kan zeker wel iets beters bedenken. Ik zou je char[] effe const maken, je laat je cpu zo een beetje te veel werk doen.
Daarnaast gaat hoef je niet van alles stings te maken om ze te vergelijken. Met ints of chars krijg je het zelfde.
BTW, het meten zou je met radom strings moeten doen. 100 keer het zelfde geeft niet echt een real resultaat. DateTime miniseconds tellen is ook niet echt betrouwbaar.

  • Juicy
  • Registratie: December 2000
  • Laatst online: 15-04 05:23
Verwijderd schreef op woensdag 25 januari 2006 @ 20:13:
Oftewel je weet het ook niet?
Dat gemekker over hoe ik iets volgens jullie zou moeten oplossen...

/edit
Ik maak dit voor een schoolopdracht en vind het gewoon leuk zo'n checkertje te maken.
Zoek het lekker zelf uit. We gaan hier echt geen schoolopdracht voor je maken.

-


Verwijderd

Topicstarter
Juicy schreef op donderdag 26 januari 2006 @ 06:57:
[...]


Zoek het lekker zelf uit. We gaan hier echt geen schoolopdracht voor je maken.
Vraag ik dat dan? Afbeeldingslocatie: http://images.fok.nl/s/bye.gif

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
Als we op deze weg verder gaan, kan het topic wel dicht.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.