อีกหนึ่งบทย่อย ว่าด้วยเรื่องที่เกี่ยวกับ API ของ C# เพราะความเคยชินในภาษาใหม่ที่ใช้งานอยู่ตอนนี้ ก็คือ Scala
หลังจากที่เขียน Scala มาพอสมควร ก็เริ่มชินและติดกับสไตล์การเขียนโค้ดแนว functional programming เข้าซะแล้ว
ประเด็นคือ ต้องกลับมาเขียน C# แล้วที่แย่คือ API ของ C# ดูโบราณไปทันที  อ่านยากและรู้สึกไม่สะดวกในบางครั้ง

ลองดูตัวอย่างเทียบแต่ละแบบ

Function C# Scala
Create List var x = new List<int> {1, 2, 3, 4, 5}; val x = list(1, 2, 3, 4, 5)
 Get Time value var t = new TimeSpan(1,0,0).Milliseconds; val t = 1.hours
 Create Tuple var t = Tuple.Create(“first”, “last”); val t = (“first”, “last”)
Handle Null int? x = null;
var result = x.HasValue ? x+5 : 5;
val x : Option[Int] = None;
var result = x.getOrElse(0) + 5;
Anonymous Function As Variable Func<int, int> f1 =  (int x) => x + 5;
var result = f1(5);
val f1 = ((x:Int) => x+5)
val result = f1(5)  // or ((x:Int) => x+5)(5)
pattern matching No val x : Option[Int] = None;
val result = x match {
case Some(v) => v + 5;
case None => 5;
}
 Map Collection

var x = new List<int> {1, 2, 3, 4,  5};
var resultX = x.Select(o => o + 5).ToList();

val x = list(1,2,3,4,5)
val resultX = x.map(o=> o + 5)

 

นี่แค่คร่าวๆ แต่ก็ยังมีที่เหลืออีกเยอะพอสมควร ที่ยังไม่ได้นำมาเทียบกัน

เลยไปค้นใน google ได้เจอกับ language-ext ซึ่งเขียนตาม Erlang API มีลักษณะการทำงานที่คล้ายกับ Scala อยู่มาก เลยหยิบตัวนี้มาแนะนำให้รู้จักและนำไปใช้งานกัน

สั่งติดตั้งผ่าน nuget Command
PS> Install-Package LanguageExt.Core

จากนั้นเพื่อให้เรียกใช้ Extension Method ของตัว Library แบบลอยๆ ได้ให้อ้าง using แบบนี้
using LanguageExt;
using static LanguageExt.Prelude;

เขียนใหม่โดยใช้ language-ext ลองเทียบกับ Scala อีกที

Function C# Language-Ext Scala
Create List var x = list(1, 2, 3, 4, 5); val x = list(1, 2, 3, 4, 5)
 Get Time value var n = 1.Hours(); val t = 1.hours
 Create Tuple var t = Tuple(“first”, “last”); val t = (“first”, “last”)
Handle Null Option<int> mm = None;
var result = mm.IfNone(0) + 5;
val x : Option[Int] = None;
var result = x.getOrElse(0) + 5;
Anonymous Function As Variable

var f1 = fun((int x) => x + 5);
var xres = f1(5);  //fun((int x) => x + 5)(5)

val f1 = ((x:Int) => x+5)
val result = f1(5)  //    ((x:Int) => x+5)(5)
pattern matching

Option<int> yy = None;
var xx = match(yy,  Some: x => x + 5, None: () => 5);
// or  yy.Some(x => x + 5).None(() => 5);

val x : Option[Int] = None;
val result = x match {
case Some(v) => v + 5;
case None => 5;
}
 Map Collection

var x = list(1,2,3,4,5);
var resultX = x.Map(o => o + 5);

val x = list(1,2,3,4,5)
val resultX = x.map(o=> o + 5)

 

จากตัวอย่างด้านบน จะเห็นว่าคล้ายกันมาก ยังไม่หมดแค่นี้ ยังมี Feature ดีๆ อีกหลายตัวเลย  ลองไปดาวน์โหลดมาติดตั้งและใช้งานกันครับ

สำหรับท่านที่เขียน API แนวนี้มา และต้องการเสพมันต่อใน C# ท่านได้สิทธิ์นั้นแล้ว 😉

 

(Visited 889 times, 1 visits today)

3 thoughts on “C# Language Extensions

Leave a Reply