Saturday, November 2, 2019

Linq எக்ஸ்டென்சன் மெத்தட்கள். linq 2nd part



எக்ஸ்டென்சன் மெத்தட் என்றால் என்ன என்று பார்ப்பதற்கு முன்னால் ஒரு சிறிய சான்றினை பார்ப்போம்.
லிங்க் கொரி ஆபரேட்டர்கள் select, where போன்றவை Enumerable கிளாஸில் ஏக்ஸ்டன்சன் மெத்தட்களாக இம்ப்ளிமெண்ட் செய்யப்பட்டுள்ளன (I
Enumerable<T> இன்டெர்ஃபேஸில்ல் அறிவிக்கப்பட்டுள்ளது).
List<int> Numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

IEnumerable<int> EvenNumbers = Numbers.Where(n => n % 2 == 0);

இதில் where மெத்தட் list கிளாஸில் உள்ள மெத்தட் அல்ல. எனினும் இந்த மெத்தட் அழைப்பு சாத்தியமாகின்றது.ஏனெனில் where மெத்தட் ஆனது IEnumerable<T> இன்டெர்ஃபேஸில் அறிவிக்கப்பட்டுள்ளது. அந்த இன்டெர்ஃபேசை list<T> கிளாஸ் இம்ப்ளிமெண்ட் செய்கின்றது.
இப்பொழுது எக்ஸ்டெண்சன் மெத்தட் எவ்வாறு பயன்படுத்தப்படுகின்றது என பார்ப்போம்.
String கிளாஸில் ஒரு மெத்தட் டிஃபைன் செய்ய வேண்டும். சான்றிற்கு ChangeFirstLetterCase() என்ற மெத்தட் இது ஒரு ஸ்ட்ரிங்கின் முதல் எழுத்தை லோயர் கேஸ் ஆக இருந்தால் அப்பர் கேஸ் ஆகவும் அப்பர் கேஸ் ஆக இருந்தால் லோயர் கேஸ் ஆகவும் மாற்ற  வேண்டும்.
 String StrName=”Muthukarthikeyan”;
string result = strName.ChangeFirstLetterCase();
ChangeFirstLetterCase() மெத்தடை ஸ்ட்ரிங்க் கிளாஸில் அறிவிப்பது சாத்தியமல்ல. ஏனெனில் string கிளாஸ் ஆனது ஏற்கனவே உள்ளது. அதில் மாற்றம் செய்வது இயலாது.
இப்பொழுது ஒரு ரேப்பர் கிளாஸ் எழுதுவோம்.
public class StringHelper
{
    public static string ChangeFirstLetterCase(string inputString)
    {
        if (inputString.Length > 0)
        {
            char[] charArray = inputString.ToCharArray();
            charArray[0] = char.IsUpper(charArray[0]) ?
                char.ToLower(charArray[0]) : char.ToUpper(charArray[0]);
            return new string(charArray);
        }

        return inputString;
    }

}

ரேப்பர் கிளாஸ் வேலை செய்யும் எனினும்
string result = strName.ChangeFirstLetterCase();
என்று அழைப்பது சாத்தியமல்ல.
பின் வருமாறு தான் அழைக்க  வேண்டும்
string result = StringHelper.ChangeFirstLetterCase(strName);
ஆனால் இதை சாத்தியமாக்குவதற்கு ChangeFirstLetterCase() மெத்தடை எக்ஸ்டன்சன் மெத்தட் ஆக அறிவிக்க வேண்டும்.
அதற்கு கீழ் கண்ட இரண்டு மாறுதல்கள் செய்ய வேண்டும்.
1.      முதலில் கிளாஸை static ஆக மாற்ற வேண்டும்.
2.      மெத்தட் எந்த டைப்பை எக்ஸ்டென்ட் செய்கின்றதோ அதை முதல் பாரா மீட்டர் ஆக this கீவேர்டுடன் செலுத்த வேண்டும்.

Public static class StringHelper
{
    public static string ChangeFirstLetterCase( this string inputString)
    {
        if (inputString.Length > 0)
        {
            char[] charArray = inputString.ToCharArray();
            charArray[0] = char.IsUpper(charArray[0]) ?
                char.ToLower(charArray[0]) : char.ToUpper(charArray[0]);
            return new string(charArray);
        }

        return inputString;
    }

}
நிரல் வரிகள் மேற்கண்ட வாறு மாற்றம் செய்யப்பட வேண்டும்.
இந்த 2 மாற்றங்களுடன் பின் வருமாறு அழைப்பது சாத்தியமாறுகின்றது மேலும் இன்டெலிசென்ஸ் உதவியும் கிடைக்கின்றது.
string result = strName.ChangeFirstLetterCase();

எனினும் நிரலானது பின் கண்ட அழைப்பையே இன்டெர்னல் ஆக செயற்படுத்துகின்றது.

.
string result = StringHelper.ChangeFirstLetterCase(strName);
அதே மதிரி லிங்க் எக்ஸ்டன்சன் மெத்தட்களும் செயற்படுகின்றது

ஏனெனில் எல்லா லிங்க் எக்ஸ்டென்சன் மெத்தட்களும் Enumerable கிளாஸில் டிஃபைன் செய்யப்பட்டுள்ளன.



நாம் எழுதும் கீழ்க்கண்ட் வரிகள்
List<int> Numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

IEnumerable<int> EvenNumbers = Numbers.Where(n => n % 2 == 0);
பின் வருமாறு  வரிகளுக்கு ஒப்பானது.
List<int> Numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

IEnumerable<int> EvenNumbers = Enumerable.Where(Numbers, n => n % 2 == 0);
தொடரும்.
நன்றி.
முத்து கார்த்திகேயன்,மதுரை.
ads Udanz

No comments:

Post a Comment