Recimo, da potrebujemo na obstoječem tipu String novo metodo, ki bo preverila ali stanje objekta ustreza določemu pravilu. Lahko bi z regular expressions preverili ali je obstoječa vrednost objekta pravilen e-mail naslov ali ne.
V našem primeru bomo razširili tip String z metodo, ki bo preverila ali je vrednost palindrom.
Napišemo extensiom method takole:
1 public static class String
2 {
3 public static bool isPalindrome(this string s)
4 {
5 string result = string.Empty;
6 char[] charArray = s.ToCharArray();
7
8 for (int i = 0; i < s.Length; i++)
9 {
10 result = result + charArray[s.Length - (i + 1)];
11 }
12
13 if (s == result)
14 return true;
15 else
16 return false;
17 }
18 }
Lame implementacija palindrom-checker funkcije, če ve kdo boljšo naj pove :)
Za test naredimo array stringov in za vsak element v arraju pokličimo naš nov extension method isPalidrome()
Loop izpiše, F, T, T, F, T1 var words = new string[] { "kaj", "ata", "bab", "bla", "radar" };
2
3 var foo = words.Select(x => x.isPalindrome());
4
5 foreach (bool b in foo)
6 Console.WriteLine(b);
Primer s preverjanjem stringa, če ustreza vzorcu veljavnega email naslova. User defined extension metode so lahko tudi v poljubnem razredu. Smotrno je, da imamo vse extension metode na enem mestu npr. v MyExtensions razredu. Če so splošno uporabne, lahko naredimo tudi code library(assembly) in ga vključimo v nadaljnje aplikacije, ki jih bomo razvijali.
1 public static class MyExtensions
2 {
3 public static bool IsValidEmailAddress(this string s)
4 {
5 Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
6 return regex.IsMatch(s);
7 }
8 }
Preverjanje nove extension metode na listi stringov:
Action
Na generični kolekciji uporabimo default extension metodo ForEach() in ji damo
za parameter delegat(pointer na anonimno metodo).
1 Action<string> email = e => Console.WriteLine(e.IsValidEmailAddress());
2
3 var emailList = new List<string>
4 {
5 "bla@bla",
6 "matjaz.curic@pro-bit.si",
7 "localhost",
8 "root@google.com.com.com.si"
9 };
10
11 emailList.ForEach(email);
Izpiše, F, T, F, T (Zadnji T verjetno ni vredu ... tako se je sparsal string na podlagi regular izraza, obstajajo tudi boljši pattern marcheri( za maile, ampak to zdaj ni tema ...).
0 comments:
Post a Comment