หลาย ๆ คนคงได้ใช้ .NET 2.0 กันพอสมควรแล้ว น่าจะได้เห็น API ที่เพิ่มเข้ามาใหม่มากมาย

ใน class Array นั้นมี static method ใหม่ ๆ เพิ่มเข้ามามาก และส่วนใหญ่ก็จะเป็น generic method แล้วบาง method นั้นก็รับ parameter เป็น generic delegate ใหม่ ๆ เช่น
public static TOutput[] ConvertAll<TInput,TOutput>(TInput[], Converter<TInput, TOutput>);
public static T[] FindAll<T>(T[], Predicate<T>);
public static void ForEach<T>(T[], Action<T>);
public static bool TrueForAll<T>(T[], Predicate<T>);
เห็น parameter type แล้วคงงง parameter ตัวหลังนั้นคือ generic delegate ครับ ลองดู signature กัน
public delegate void Action<T>(T);
public delegate TOutput Converter<TInput,TOutput>(TInput);
public delegate bool Predicate<T>(T);

ครับ Predicate ก็คือ method ที่คอยตรวจสอบค่า parameter ว่าเป็นค่าที่เราต้องการหรือไม่
ส่วน Action ก็คือ method ที่นำ parameter ไปทำอะไรซักอย่าง

ทีนี้ลองมาดูการใช้งาน method เหล่านี้กัน

void MyMethod() {
    Color[] pixels = GetPixels();
    // C# 2.0 allow you do not need to create the delegate explicitly
    // Color[] shadows = Array.FindAll(pixels, new Predicate(IsShadow));
    Color[] shadows = Array.FindAll(pixels, IsShadow);
    int[] argb = Array.ConvertAll(shadows, ToArgb);

}

bool IsShadows(Color c) {
    return (c.R + c.G + c.B) / 3 < 96;
}

int ToArgb(Color c) {
    return c.ToArgb();
}
void SomeMethod() {
    int[] nums = GetErrorCode();
    int[] negativeVals = ArrayFindAll(nums, IsNegative);
    Array.ForEach(negativeVals, WriteLog);
}

bool IsNegative(int n) {
    return n < 0;
}

void WriteLog(int n) {
    Trace.WriteLine(n);
}
bool ValidateAddresses() {
    TextBox[] txtAddresses = GetAddresses();
    return Array.TrueForAll(txtAddresses, HasText);
}

bool HasText(TextBox txt) {
    return txt.TextLength > 0;
}

จะเห็นได้ว่าเราต้องเปลืองที่มาเขียน method สั้น ๆ ที่ไม่ได้ทำอะไรซักเท่าไหร่ เพื่อให้สามารถส่งไปเป็น parameter ของ method นั้นได้ (ตัวอย่างอาจดูงี่เง่าไปนิดหน่อย ก็อย่าไปสนใจมันเลยเนอะ)

ทีนี้ถ้าเราเอา anonymous method มาช่วยลดความยุ่งยากลง ก็จะได้ดังนี้

void MyMethod() {
    Color[] pixels = GetPixels();
    Color[] shadows = Array.FindAll(pixels, delegate(Color c) { return (c.R + c.G + c.B) / 3 < 96; });
    int[] argb = Array.ConvertAll(shadows, delegate(Color c) { return c.ToArgb(); });
}
void SomeMethod() {
    int[] nums = GetErrorCode();
    int[] negativeVals = ArrayFindAll(nums, delegate(int n) { return n < 0;});
    Array.ForEach(negativeVals, delegate(int n) { Trace.WriteLine(n); });
}
bool ValidateAddresses() {
    TextBox[] txtAddresses = GetAddresses();
    return Array.TrueForAll(txtAddresses, delegate(TextBox txt) { return txt.TextLength > 0; });
}
---------------------------------- แถม ----------------------------------
ถ้าเขียนด้วย lambda expression ใน C# 3.0 จะำได้ code ที่สั้นลงไปอีก
void MyMethod() {
    Color[] pixels = GetPixels();
    Color[] shadows = Array.FindAll(pixels, c => (c.R + c.G + c.B) / 3 < 96);
    int[] argb = Array.ConvertAll(shadows, c => c.ToArgb());
}
void SomeMethod() {
    int[] nums = GetErrorCode();
    int[] negativeVals = ArrayFindAll(nums, n => n < 0);
    Array.ForEach(negativeVals, n => Trace.WriteLine(n));
}
bool ValidateAddresses() {
    TextBox[] txtAddresses = GetAddresses();
    return Array.TrueForAll(txtAddresses, txt => txt.TextLength > 0);
}

Comment

Comment:

Tweet

udavccuw dvkltadl xynhbful

#11 By GRONVIYgLQOo (94.102.49.213) on 2009-08-14 23:28

wmofqooa lpioyfvd pwkjjgnh

#10 By SNYuJczHfSUo (94.102.49.213) on 2009-08-14 19:04

zdgvxzfr qetgstqg necqqope

#9 By eOFskTmPxBuuLV (94.102.49.213) on 2009-08-14 17:42

mdtjuwpu pybikzvb zzbbgfof

#8 By dnnUJqTTVeqIaSP (94.102.49.213) on 2009-08-14 16:16

ihbcmvnc gepkgiiv udrayzxo

#7 By lrRoNjEyBLCXmKgEd (94.102.49.213) on 2009-08-14 14:52

likcoris aabergyw skckxfft

#6 By CxUWxmSOr (95.169.190.71) on 2009-08-01 11:15

bmqxvizd axthpged oybgitwn

#5 By WlKVEbZqot (95.169.190.71) on 2009-08-01 08:34

Z3XRKa ihentynr gfuobhgq ptvknuoo

#4 By OBiPzMIiNJu (89.248.172.50) on 2009-07-28 15:06

ยังไม่ค่อยรู้เรื่อง lampda expression เท่าไหร่แฮะ ต้องไปศึกษาเพิ่ม...

#3 By นายตาหวาน on 2007-02-05 12:47

ตอนเห็น Generic ครั้งแรกเป็นงง เพราะดันมี <T> เนี่ยแหล่ะโผล่มา
ใน VB มีแต่วงเล็บ พอมาลองเล่น C# มี [ ] เพิ่มเข้ามาก็ยังไม่งง แต่พอเจอ < > เข้าไปอีก เฮ้ย! ภาษานี้มันจะอะไรกันนักหนาฟระ!!

#2 By NinkungZ on 2007-02-05 11:43

ไม่รู้เรื่อง...จบ

แล้วจะเข้ามาเม้นต์ทำไมหว่า....

แหมเอาน่าไหนๆก็เข้ามาแล้ว....
ฝันดีแล้วกันเนาะ

#1 By NuNual on 2007-02-04 23:07