จาก Blog ตอนก่อนหน้า [C#] ถ้า GroupBy แล้วห้ามใช้ตัวแปรชนิด var มารับหละ ? ตัวอย่างที่ผมได้ยกไปเป็นการ Group By โดยใช้เพียง 1 Property เท่านั้นครับ แต่ใช้ชีวิตจริง มีการใช้งานมากกว่า 1 Property ครับ ยกตัวอย่าง เช่น
- ก่อนปรับ : มีการใช้งาน 2 Property ครับ ได้แก่ ValueDate และ CashSecurityGroupCode ซึ่งมีชนิดข้อมูลเป็น DateTime และ String ตามลำดับครับ
var nostroForReportGroup = AMSDetaills.GroupBy(ds => (ds.ValueDate, ds.CashSecurityGroupCode)); foreach (var nostroForReportEntry in nostroForReportGroup) { IList<DsetExpAMSDetailDTO> AMSbyGroupls = nostroForReportEntry.ToList(); //มี Select(a =>a) ซ้อนเสียเวลา Loop 1 รอบ //... }
ถ้าเราจะเล่นมุกเดิมใน Blog ที่แล้ว มันจะใช้งานไม่ได้ครับ เพราะ IGrouping<TKey, TValue> รองรับ Parameter 2 ตัวครับ ได้แก่ TKey กับ TValue ปัญหาที่พบ คือ Tkey มันมี 1 ตัว แต่เรา Group By โดยใช้ 2 Key หรือ 2 Property ครับ คราวนี้ เราจะแก้ปัญหาอย่างไรครับ
- วิธีแรก สร้าง Class ใหม่มาเลยครับ เพื่อรองรับ Property ที่เป็นเงื่อนไขของ GroupBy ครับ จากตัวอย่างที่ยกมาข้างตันเนี่ย ผมต้องสร้าง Class ใหม่ที่มี Property DateTime และ String แต่วิธีนี้อย่าหาทำครับ เพราะ มันจะได้ Class เยอะมากกกกกก ยากแก่การดูแลรักษาภายหลังครับ
- วิธีสอง ทำ Key ที่ใช้ในการ GroupBy มาเป็น Turple สิ โดยเจ้า Turple เป็น Data Type ใหม่ใน C# 7 ที่มุมมองในลักษณะของแถวครับ จากตัวอย่างเรามี 2 Key เราสร้าง Turple(DateTime, String) ครับ
จากที่ได้รู้วิธีการแก้ไขไปแล้ว ผมเลือกวิธีที่ 2 ครับ วิธีแรกเอาไว้ใช้ในยามจำเป็นจริงๆครับ โดยผลลัพธ์ที่ได้หลังใช้ Turple มี ดังนี้ครับ
IEnumerable<IGrouping<(DateTime, String), DsetExpAMSDetailDTO>> nostroForReportGroup = AMSDetaills.GroupBy(ds => (ds.ValueDate, ds.CashSecurityGroupCode)); foreach (IGrouping<(DateTime, String), DsetExpAMSDetailDTO> nostroForReportEntry in nostroForReportGroup) { IList<DsetExpAMSDetailDTO> AMSbyGroupls = nostroForReportEntry.ToList(); //... }
หวังว่าวิธีนี้มีประโยชน์สำหรับผู้อ่านทุกท่านที่ประสบปัญหา หรือ ต้องการความท้าทายครับ ^__^
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.