走進Linq-Linq大觀園
系列文章導航:
不能不說的C#特性-迭代器(下),yield以及流的延遲計算
走進Linq-Linq to SQL How do I(1)
走進Linq-Linq to SQL How do I(2)
走進Linq-Linq to SQL How do I(3)
走進Linq-Linq to SQL源代碼賞析 Table的獲取過程
走進Linq-Linq to SQL源代碼賞析之Provider的初始化
走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
文章發布后大家有些人叫做,心里竊喜,不過壓力也大增,我很想按照簡潔明快的文風寫下去,不過講技術的文章很難不落于沉悶,所以我努力了。(題外話:這幾天猛看幽默小說,想把文字寫的幽默一點,開個玩笑,呵呵)
經過幾天的閉關編程大師又有了一些新的覺悟了,不管對DSL還是命令式編程和函數式編程都有了新的理解。如是他又接著了漫長的云游。第一站當然就是那個曾經讓他結下心結的那個剛畢業的coder。
大師:“嘿,這幾日可好,還在發牢騷么?”
Coder:“不了,正好你來了,讓你看看我的程序”,Coder將他的電腦屏幕轉向大師,期盼的眼神表明他急切的期望得到大師的夸獎。
如是大師看到了如下一些代碼:
///
/// 一個通用的泛型委托,代表接受一個參數并有一個返回值的方法
///
/// 輸入參數類型
/// 返回值類型
/// 輸入參數
/// 返回值
public delegate TOutput MyDelegate<TInput,TOutput>(TInput input);
///
/// 這個類是包含有對IEnumerable接口的一系列擴展方法
/// 因為在.net里所有的集合類都實現了IEnumerable接口
/// 所以對該接口的擴展將擴散到所有集合
///
public static class Extension
{
public static IEnumerable<TInput> Where<TInput>(this IEnumerable<TInput> self, MyDelegate<TInput, bool> filter)
{
foreach (TInput item in self)
if (filter(item))
yield return item;
}
public static IEnumerable<TOutput> Select<TInput, TOutput>(this IEnumerable<TInput> self, MyDelegate<TInput, TOutput> selector)
{
foreach(TInput item in self)
yield return selector(item);
}
//下面有更多的SQL風格的移植
}
/// 一個通用的泛型委托,代表接受一個參數并有一個返回值的方法
///
/// 輸入參數類型
/// 返回值類型
/// 輸入參數
/// 返回值
public delegate TOutput MyDelegate<TInput,TOutput>(TInput input);
///
/// 這個類是包含有對IEnumerable接口的一系列擴展方法
/// 因為在.net里所有的集合類都實現了IEnumerable接口
/// 所以對該接口的擴展將擴散到所有集合
///
public static class Extension
{
public static IEnumerable<TInput> Where<TInput>(this IEnumerable<TInput> self, MyDelegate<TInput, bool> filter)
{
foreach (TInput item in self)
if (filter(item))
yield return item;
}
public static IEnumerable<TOutput> Select<TInput, TOutput>(this IEnumerable<TInput> self, MyDelegate<TInput, TOutput> selector)
{
foreach(TInput item in self)
yield return selector(item);
}
//下面有更多的SQL風格的移植
}
下面是我做的個小測試代碼:
public class Program
{
public static void Main()
{
IList books = new List {
new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 },
new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 },
new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 }
};
var result = books.Where(book => book.Title == "Linq").Select(book => new {
Key = book.Title,Value=book.Price
});
}
}
{
public static void Main()
{
IList books = new List {
new Book { Title = "Inside COM", ISBN = "123-456-789",Price=20 },
new Book { Title = "Inside C#", ISBN = "123-356-d89",Price=100 },
new Book { Title = "Linq", ISBN = "123-d56-d89", Price = 120 }
};
var result = books.Where(book => book.Title == "Linq").Select(book => new {
Key = book.Title,Value=book.Price
});
}
}
全站熱搜