Thursday, May 10, 2012

มาทำความเข้าใจกับ LINQ (C#)

Introduction
จากการที่ได้ทดลอง และทดสอบโค้ดมาระยะหนึ่งแล้วทำให้เข้าใจความหมายของคำว่า Linq มาพอสมควรก็จะขอสรุปในบทความสุดท้ายประจำเดือนนี้นะครับ LINQ หรือ Language Integrated Query เป็น ฟีเจอร์ใหม่ใน Framework 3.0, 3.5 จากความหมายก็น่าจะเข้าใจพอสมควรนั่นก็คือ เป็นภาษาที่นำเข้ามาขยายประสิทธิภาพการใช้งานคิวรี ซึ่งผมชื่นชอบมากเพราะลดภาระการเขียนโค้ดในส่วนการจัดการการแสดงผลข้อมูลได้ดีพอสมควร แทนที่เราจะเขียนเมธอร์ดเพื่อดึงข้อมูลที่แตกต่างตามความต้องการของแต่ละฟอร์ม เราก็นำมารวมไว้ที่เมธอร์ดเดียว แล้วใช้ลินคิวมาจัดการอีกทีหนึ่งผมว่าประหยัดเวลาไปเยอะทีเดียวครับ ฟีเจอร์อื่นๆ ที่ถูกพัฒนามาร่วมใช้งานกับลินคิวก็มีหลายตัวที่น่าสนใจครับดังจะนำเสนอดังต่อไปนี้
New Feature
1. Automatic Properties
เรามาดูว่ามันมีความแตกต่างจากแบบเดิมอย่างไร ตัวอย่างแรกคือแบบเดิมครับ
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class Company
{
//Company ID
private int _companyId;
public int CompanyID
{
get { return _companyId; }
set { _companyId = value; }
}
 
//Company Name
private string _companyName;
public string CompanyName
{
get { return _companyName; }
set { _companyName = value; }
}
}
ส่วนต่อมาเป็นแบบที่เรียกกันว่าคุณสมบัติอัตโนมัติดังนี้ครับ
1
2
3
4
5
6
7
8
public class Company
{
//Company ID
public int CompanyID { get; set; }
 
//Company Name
public string CompanyName{ get; set; }
}
คงจะพอเห็นความแตกต่างนะครับ ว่าเราลดรูปการเขียนโค้ดไปได้มากทีเดียว โดยเฉพาะถ้าเกิดในคลาสนี้มี คุณสมบัติเยอะๆ ก็จะประหยัดเวลาไปเยอะเลยทีเดียว
2. Local Variable Type Inference
เป็นฟีเจอร์ในการแปลงตัวแปรในรูปแบบ var ไปเป็นตัวแปรที่ complier รู้จักครับให้อธิบายคงจะงง มาดูตัวอย่างกันเลย
1
2
3
4
5
num = 50;
var str = "string variable";
var obj = new Company();
var numbers = new int[] {1,2,3,4,5};
var dict = new Dictionary<int,Company>();
นี่คือรูปแบบที่เราสมารถเขียนได้ครับ ใช้คีเวิร์ด var ในการตั้งตัวแปรได้เลย แล้วก็จะแปลงอัตโนมัติให้คอมไพเลอร์เห็นเป็นดังนี้
1
2
3
4
5
int num = 50;
string str = "string variable";
Company obj = new Company();
int[] numbers = new int[] {1,2,3,4,5};
Dictionary dic = new Dictionary<int,Company>();
3. Object Initializers & Collection Initializers
ก็เป็นฟีเจอร์หนึ่งที่ผมนำมาใช้ แล้วก็ใช้งานได้ดีซะด้วยโดยเฉพาะกับ Data Object ที่ใช้ List ในการดำเนินงาน ความหมายในตัวก็คือรูปแบบการให้ค่าอ๊อบเจ็ค และข้อมูลที่เป็นคอลเลคชั่น มาดูตัวอย่างกันก่อนนะครับ ว่าโค้ดอันก่อนๆ เป็นอย่างไร
1
2
3
Company com=new Company();
com.CompanyID=1;
com.CompanyName="Test Company";
มาดูรูปแบบใหม่กันมั่งครับ สามารถเขียนโค้ดได้ดังนี้
1
Company com=new Company{ CompanyID=1, CompanyName="Test Company"}
สำหรับคนที่ไม่เคยเขียนการให้ค่า Data Object คงจะมองว่าไม่ต่างกันมากนัก แต่ลองไปทำดูครับ โดยเฉพาะการถ่ายค่าไปยัง ตัวแปรแบบ Generic( List ) แล้วท่านจะเห็นความแตกต่าง อย่าพอใจแค่รู้เท่านั้นนะครับต้องทำและเข้าใจกับมันถึงจะเกิดผล
4. Anonymous Types
เกี่ยวกับเรื่องนี้ก็ได้พูดไปเยอะแล้ว ลองดูเรื่องก่อนหน้านี้ รู้สึกว่าจะเน้นเรื่องนี้เหลือเกิน เนื้อหาอาจจะไม่ชัดเจนนะครับ แต่คิดว่าตัวอย่างที่ทำไว้พอนำไปใช้งานได้ดีในระดับ มาดูโค้ดก็แล้วกันครับ
1
var company = new {ID=1, Name="Test Company"}
สรุปก็เป็นเรื่องเกี่ยวกับการสร้าง Structure ขึ้นมาใช้งานเองโดยไม่ยึดติดกับ การต้องมี คลาสและคุณสมบัติของคลาสขึ้นมาก่อน แล้วค่อยสร้าง Instance ขึ้นมาใช้งาน คงพอจะนึกออกนะครับ ว่าปกติเราจะสร้างตัวแปรที่มี Propertie เราจะต้องสร้าง Class มาก่อนแล้วค่อย นำมาใช้งาน
5. Lambda Expressions
ตัวนี้ยังไม่ได้ลองใช้งานจริงๆ แต่จากข้อมูลเขาว่ากันว่าใน c# 2.0 นั้นการจะสร้าง Method ขึ้นมาใช้งานนั้นจะต้องมีการกำหนดรูปแบบของเมธอร์ด และเขียนโค้ดในบล็อคเมธอร์ดที่กำหนดไว้เท่านั้น แต่ในฟีเจอร์ใหม่นี้เราสามารถเขียนขึ้นที่ไหนก็ได้ในการสร้างเมธอร์ดหรือฟังก์ชั่นการทำงาน ลองดูตัวอย่างโค้ดที่ผมนำมาจากที่อื่นนะครับ เพราะผมยังไม่ได้นำมาประยุกต์ใช้งาน ดังนี้
1
2
3
4
5
6
7
8
delegate R MyDeleg(A arg);
 
MyDeleg IsPositive = delegate(int num)
{
return num &gt; 0;
};
 
MyDeleg IsPositive = num => num > 0;
รายละเอียดการใช้งานถ้าได้เพิ่มเติม จะเขียนอธิบายใหม่ให้แจ่มแจ้งในบทความต่อๆไปนะครับ
6. Extension Methods
เท่าที่ดูๆ มาเป็นการสร้างเมธอร์ด โดยที่ไม่ต้องนำมา รีคอมไพล์ใหม่ ยังไม่ได้ลองเหมือนกับครับ สำหรับวันนี้เอาตัวอย่างไปก่อนแล้วกัน แล้ววันหลังจะหามาเขียนเพิ่มเติมครับ
1
2
3
4
5
6
7
8
9
public static class MyExtensions {
 
public static bool IsValidEmailAddress(this string s) {
 
Regex regex = new Regex( @"^[w-.]+@([w-]+.)+[w-]{2,4}$" );
 
return regex.IsMatch(s);
}
}
ต่อมา เป็นโค้ดการเรียกใช้งาน Method ที่เขียนขึ้นตามโค้ดด้านบน
1
2
3
4
5
6
7
8
using MyExtensions;
string email = Request.QueryString["email"];
 
if ( email.IsValidEmailAddress() ) {
 
// ...
 
}
7. Query Syntax
อันสุดท้ายก็เป็นพระเอกของงานนี้เลยครับ นั่นก็คือ Query Syntax นำมาใช้งานได้ดีทีเดียว เป็นรูปแบบการใช้งานตามโครงสร้างง่ายๆ นั่นก็คือ … from … where … select เรามาดูตัวอย่างการใช้งานคร่าวๆ นะครับบทนี้ขอกล่าวแบบสรุปๆ ตามนี้
1
2
3
4
var comp = comdb.Select();
var newcomp = (from c in comp
where c.CompanyName.Contains(toolStripTextBox1.Text)
select c);
ซึ่งรายละเอียดเกี่ยวกับเรื่องนี้ สามารถดูในบทความก่อนหน้านี้นะครับ ได้เขียนตัวอย่างแบบง่ายๆ ไว้หลายหัวข้อเหมือนกัน
Summary
สรุป บทนี้ขอกล่าวรวมๆ ถึงการใช้งาน LINQ (C#) ในหัวข้อทั้ง 7 ที่เกี่ยวข้อง เพื่อง่ายในการไปเจาะลึกรายละเอียดกันอีกที วันนี้ก็เป็นวันสุดท้ายของเดือนแล้ว ก็ขอให้ทุกคนมีความสุขกับการจัดการเงินเดือนก็แล้วกันเน้อ
อ้างอิงให้เขาหน่อย

No comments:

Post a Comment