Feedback

C# - alphanumerisch

Veröffentlicht von am 11/11/2015
(1 Bewertungen)
Prüfen ob des String alphanumerisch ist.

using System.Linq;
        public static bool AlphaNumericString(string Alphanumeric)
        {
            char[] Buchstaben = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
            char[] Zahlen = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

            if (string.IsNullOrWhiteSpace(Alphanumeric)) 
                return false;

            Alphanumeric = Alphanumeric.ToLower();
            

            foreach (var item in Alphanumeric)
            {
                if (!Buchstaben.Contains(item) && !Zahlen.Contains(item) && !char.IsLetterOrDigit(item))
                {
                    return false;
                }
            }

            return true;
        }
Abgelegt unter alphanumerisch.

4 Kommentare zum Snippet

Koopakiller schrieb am 11/11/2015:
2 Gedanken zum Snippet:
1.) Auch Großbuchstaben sind Alphanumerisch
2.) Die Prüfung mittels chr>='0'&&chr<='9' usw. ist vermutlich um ein vielfaches effizienter.
PaWe1481 schrieb am 11/11/2015:
oh stimmt. Jetzt müsste es auch mit Großbuchstaben funktionieren.
Martin Stühmer schrieb am 11/12/2015:
Hallo PaWe1481,

deine Methode ist leider noch sehr anfällig für fehlerhafte Ergebnisse/Exceptions.

1. Sollte die Variable 'Alphanumeric' == null sein kommt es zu einer Unhandled Exception.
Dies kannst du durch folgende Erweiterung korrigieren.
if (string.IsNullOrWhiteSpace(Alphanumeric)) return false;


2. Berücksichtigt deine Methode keine Umlaute ob, dh. du wärst mit jeder neuen Sprache am erweitern deiner Char Arrays.
Da du sonst fehlerhafte Rückgaben erhälst, z.B. im Deutschen haben wir die Umlaute 'ÜÖÄ' und im Französischen haben wir die Umlaute mit Akzenten 'àá' etc.
Abhilfe schafft hier die folgende Methode
char.IsLetterOrDigit(c)


3. Die Performance deiner Methode ist leider ein vielfaches Langsamer als in einer regulären Implementierung.

Ich hab mal meine komplette Testklasse angehangen.
    using System;
using System.Diagnostics;
using System.Linq;

class ExampleIsAlphaNumericProgram
{
private static int _iterations = 1000000;

static void Main(string[] args)
{
const string text = "Loremipsumdolorsitamet,consetetursadipscingelitr,seddiamnonumyeirmodtemporinviduntutlaboreetdoloremagnaaliquyamerat,seddiamvoluptua.Atveroeosetaccusametjustoduodoloresetearebum.Stetclitakasdgubergren,noseatakimatasanctusestLoremipsumdolorsitamet.Loremipsumdolorsitamet,consetetursadipscingelitr,seddiamnonumyeirmodtemporinviduntutlaboreetdoloremagnaaliquyamerat,seddiamvoluptua.Atveroeosetaccusametjustoduodoloresetearebum.Stetclitakasdgubergren,noseatakimatasanctusestLoremipsumdolorsitamet.";

Console.WriteLine($"Iterations: {_iterations}");
Console.WriteLine($"IsAlphanumericChar: {MeasureStringIsAlphanumeric(text, IsAlphanumericChar):N2} ms");
Console.WriteLine($"IsAlphanumericPaWe1481: {MeasureStringIsAlphanumeric(text, IsAlphanumericPaWe1481):N2} ms");

Console.WriteLine();
Console.WriteLine("Tests");
TextTests("ÄÖÜßäöü", "German:");
TextTests("ÀàÂâÇçÈèÉéÊêË", "France:");

Console.ReadLine();
}

private static double MeasureStringIsAlphanumeric(string value, Func<string, bool> method)
{
Stopwatch sw = new Stopwatch();
double result = 0;
for (int i = 0; i < _iterations; i++)
{
sw.Restart();
method.Invoke(value);
sw.Stop();
result += sw.Elapsed.TotalMilliseconds;
}

return result;
}

private static bool IsAlphanumericChar(string value)
{
if (string.IsNullOrWhiteSpace(value)) return false;

foreach (var c in value)
{
if (char.IsLetterOrDigit(c)) return false;
}

return true;
}

private static bool IsAlphanumericPaWe1481(string Alphanumeric)
{
char[] Buchstaben = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
char[] Zahlen = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

Alphanumeric = Alphanumeric.ToLower();

foreach (var item in Alphanumeric)
{
if (!Buchstaben.Contains(item) && !Zahlen.Contains(item))
{
return false;
}
}

return true;
}

private static void TextTests(string value, string description)
{
bool resultChar = IsAlphanumericChar(value);
bool resultPaWe = IsAlphanumericPaWe1481(value);

Console.WriteLine($"Test results for {description}'{value}' - Char Method {resultChar} - PaWe Method {resultPaWe}");
}
}


Gruß Martin
PaWe1481 schrieb am 11/20/2015:
Danke Martin für die Verbesserungsvorschläge. Ich habe den Code jetzt angepasst.

Gruß Patrick
 

Logge dich ein, um hier zu kommentieren!