[C#] ถ้า GroupBy โดยใช้หลาย Property แล้วห้ามใช้ตัวแปรชนิด var หละ

จาก 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.