Thursday, May 10, 2012

การใช้เงื่อนไขในการกรองข้อมูลกับ Anonymous Type in C#

ในหลายๆ วันที่ผ่านมาก็ได้ทดลองการเขียนโค้ดเกี่ยวกับ การดึงข้อมูลจากตัวแปร Anonymous Type ซึ่งก็ไม่ยากอย่างที่คิด แต่มันก็ต้องใช้เวลาทำความเข้าใจ ผมพูดได้เต็มปากได้เลยว่าไม่มีใครจำรูปแบบการใช้งานได้ในการเขียนโค้ดตามตัวอย่างแค่ครั้งเดียว ผมเริ่มศึกษาจากตัวอย่างง่ายๆ ที่หามาได้จากหนังสือ ซึ่งก็หลายเล่มอ่านกันจนเบื่อเลยละครับ ตัวอย่างแรกดังนี้ครับมีดังนี้ครับ
1
2
3
4
5
6
//การใช้เงื่อนไขในการดึงข้อมูลจากตัวแปร
var numbers = new int[] {0, 1, 2, 3, 4, 5, 6, 7};
 
var numberset = from n in numbers orderby n descending select n;
foreach(var n in numberset)
Console.WriteLine(n);
ตัวอย่างแรก จะเห็นถึงรูปแบบการดึงข้อมูลมาทั้งหมด แต่มีการให้เรียงข้อมูลใหม่จากมากไปหาน้อย ตามตัวอย่างคือ descending และคำสั่งที่ให้เลือกทั้งหมดนั่นคือ
01
02
03
04
05
06
07
08
09
10
select n in numbers
 
//* สำหรับคำสั่งจากน้อยไปหามากให้ใช้
ascending
 
//การใช้เงื่อนไขในการดึงข้อมูลจากตัวแปรแบบ
var songs = new string[]{"Way back into love", "My way"};
var newsong= from song in songs select new {Title=song};
foreach(var s in newsong)
Console.WriteLine(s.Title);
ตัวอย่างที่สองก็คล้ายๆ ตัวอย่างแรกแต่เป็นแบบชนิดอักษร และจะเห็นว่า นำตัวแปรแรกมาสร้างคุณสมบัติเพิ่มขึ้นมาใหม่ ต่อไปเป็นตัวอย่างการใช้เงื่อนไขในการเลือกข้อมูล
เริ่มด้วย การสร้างคลาสตามข้างล่าง
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace TestLinqConsole
{
class Person
{
private int _Id;
public int ID
{
get { return _Id; }
set { _Id = value; }
}
 
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
 
private string _email;
public string Email
{
get { return _email; }
set { _email = value; }
}
 
}
}
ต่อมาเป็นการนำข้อมูลมาแสดงตามเงื่อนไข
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public void ListPersonByCondition()
{
Console.Clear();
List
people = new List
{
new Person{ID=1, Name="Paul", Email="pkimmel@softconcepts.com"},
new Person{ID=2, Name="Joe", Email="jswan@gmail.com"}
};
var names = from p in people
where p.ID == 1
orderby p.Name
select new { FirstName = p.Name, p.Email };
foreach (var name in names)
Console.WriteLine(name.FirstName + " ," + name.Email);
 
Console.WriteLine("Press any key to back to menu...");
Console.ReadLine();
}
ตามรูปแบบให้เราใส่เงื่อนไข ตามหลังสเตทเมนต์ แวร์ และก่อน ซีเลค ตามตัวอย่าง โอเปอเรเตอร์ที่ใช้ก็เหมือนการเขียนโค้ดทั่วไปได้แก่ ==, !=, >, <, &&, || เหมือนกับโอเปอเรเตอร์ในภาษา c#
ตัวอย่างการใช้โอเปอเรเตอร์อื่นได้แก่
1
where p.Name=="Paul",  where p.Name.StartsWith("P"), where p.ID != 1 &amp;&amp;
อีกตัวอย่างหนึ่งที่น่าสนใจ ตามตัวอย่างนี้
1
2
3
4
5
var contacts =
from customer in db.Customers
where customer.Name.StartsWith("A") &amp;&amp; customer.Orders.Count &gt; 0
orderby customer.Name
select new { customer.Name, customer.Phone };
*จะเห็นว่ามี การกระทำที่มากกว่าการเปรียบเทียบระหว่างฟิลด์ข้อมูลสองฟิลด์ แต่เป็นรูปแบบในการกรองข้อมูลจากฟิลด์เดียว ตามตัวอย่างด้านบน เช่น StartsWith(“A”) , customer.Orders.Count
ตัวอย่างอื่นๆ ในการใช้งานจากหนังสือ Manning Linq in action
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
string[] words =
{ "hello", "wonderful", "linq", "beautiful", "world" };
var shortWords =
from word in words
where word.Length &lt;= 5
select word;
foreach (var word in shortWords)
Console.WriteLine(word);
 
var groups =
from word in words
orderby word ascending
group word by word.Length into lengthGroups
orderby lengthGroups.Key descending
select new {Length=lengthGroups.Key, Words=lengthGroups};
foreach (var group in groups)
{
Console.WriteLine("Words of length " + group.Length);
foreach (string word in group.Words)
Console.WriteLine(" " + word);
}
จะเห็นรูปแบบการจัดกลุ่มข้อมูลโดยคำสั่ง group … by … into …
สรุป บทความตอนนี้ บันทึกความเข้าใจเบื้องต้นเกี่ยวกับการกรองข้อมูลมาใช้งาน โดยการใช้เงื่อนไข และรูปแบบการใช้งานตัวแปรชนิดนี้ แบบง่ายๆ

No comments:

Post a Comment