Filtrowanie danych c#

0

Zawsze posiadam ten sam problem, kiedy chodzi o filtrowanie wprowadzanych danych. Ostatnio pisalem mala symulacje banku i zeby nie zasmiecac glownego kodu stowrzylem klase Czytacz do wczytywania i filtrowania danych.. Zamieszcze tu fragment kodu i mam nadzieje, ze ktos bedzie potrafil odpowiedziec mi na pytanie czy da sie to jakos prosciej zrealizowac...
Wspomne jeszcze, ze probowalem uzyc klas generycznych, zeby nie duplikowac metod dla Int i Dobule np. , ale potrzebuje w nich operatorow porownania, ktorych c# zabrania w szablonach, wiec nie wiem juz co poczac..

Kod:

 class Czytacz
    {

        public static int Int(int dol, int gora)
        {
            int x = 0;
            string tmp = "";
            do
            {
                try { tmp = Poprawny("int"); } 
                catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }

                x = int.Parse(tmp);

            } while (!(dol <= x && x <= gora));

            return x;
        }

        public static double Double(double dol, double gora)
        {
            double x = 0;
            string tmp = "";
            do
            {
                try { tmp = Poprawny("double"); }
                catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }

                x = double.Parse(tmp);

            } while (!(dol <= x && x <= gora));

            return x;
        }

        private static string Poprawny(string np)
        {

            string str1 = Console.ReadLine();
            string delim = "123456789abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` ";

            if (np == "string")
            { delim = "123456789!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` "; }
            else if (np == "int")
            { delim = "abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.>,</?|\\+=-_~` "; }
            else if (np == "double")
            { delim = "abcdefghijklmnoprstuwxyząćęóśłżźń!@#$%^&*()_+{}[]\"\';.></?|\\+=-_~` ";  }
            
            string str2 = str1.Trim(delim.ToCharArray());

            if (str1 != str2)
                throw new ZlyNapisException(str1);
            
            return str1;
        }

        public static string String()
        {
            string napis = "";
            while (napis == "")
            {
                try { napis = Poprawny("string"); }
                catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
            }

            return napis;
        }

        public static string Pesel()
        {
            string napis = "";
            while (napis == "" || (napis.Length != 11))
            {
                try { napis = Poprawny("int"); }
                catch (ZlyNapisException n) { Console.WriteLine("Uzyto niedozwolonych znakow w: '" + n.getNapis() + "'"); }
            }

            return napis;
        }

    }

A tutaj fragment z przykladowym uzyciem:

switch (x)
                {
                    case 1:
                        Console.WriteLine("Podaj imie, nazwiso oraz pesel\n");
                        bank.DodajKlienta(Czytacz.String(), Czytacz.String(), Czytacz.Pesel());
                        break;
                    case 2:
                        Console.WriteLine("Podaj id klienta, ktorego chcesz usunac:\n");
                        bank.UsunKlienta(Czytacz.Int(0, 999999999));
                        break;

Prosze zwrocic uwage jeszcze na aspekt, ze w case 2: uzywam wczytywania inta ktory moze byc praktycznie dowolnie wielki, bo nie wiadomo jak duza jest baza klientow, stad gdybym chcial znowu zrobic oddzielna metode dla inta bez parametrow, to by bylo juz tak zasmiecone i duplikowane ze golwa mala..

0

Nie widzę w twoim poście pytania, ale zakładam, że chodzi ci o "jak oczyścić ten kod".

Po pierwsze oddziel walidację od wczytywania z konsoli. Po drugie zastanów się, czy to zaawansowane oczyszczanie danych trim-em jest ci naprawdę potrzebne.
Potem poszukaj inspiracji na google albo stackoverflow. Możesz na przykład zrobić prostą klasę, przyjmującą w konstruktorze string (np. linia z konsoli) i posiadającą metody/właściwości: IsInteger, IsDouble, IsPesel, IsInRange()... Powinno być schludniej, a jak ci się tych metod namnoży, to sobie to wtedy rozbijesz.
Poczytaj o:

  • metodach Parse() i TryParse() w string, int, double, itp.
  • System.Convert

Co do klas generycznych to dałoby się tak zrobić. Do konwertowania pewnie potrzebowałbyś:

TypeConverter converter = TypeDescriptor.GetConverter( T );

a do porównywania:

class validator<T> where T : IComparable
{
    metoda( T dol, T gora )
    {
        int diff = dol.CompareTo( gora );
    }
}

ale możesz tak zabrnąć w ślepą uliczkę.</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1