上次我們說到了linq對數組內容的檢索,自.net2.0以后,泛型成了很常見的一種應用技術,linq對泛型的檢索也提供了完善的支持
如對list類型的支持,范例如下:
class PRogram { static void Main(string[] args) { List<Books> samplebooks = new List<Books>() { new Books{Id=1,Name="book1"}, new Books{Id=2,Name="book2"}, new Books{Id=3,Name="book3"} }; var book = samplebooks.Where(p => p.Name.Contains("2")) .Select(p=>p.Name); foreach (var item in book) { Console.WriteLine(item); } Console.Read(); } } class Books { public int Id { get; set; } public string Name { get; set; } }
以上的例子只是我們很常見的一個場景,那么linq是不是支持我們.net中的所有類型呢,事實上linq支持所有實現了IEnumable<T>接口的集合,.net中的大部分集合都實現了該接口,但是并不是所有的集合都實現 了該接口事實上只有支持強類型胡集合才實現了該接口,如數組,list,字典等,都是強類型的,所以我們可以對這些對象應用linq to object技術。
對于非泛型的集合,如arrarlist,dataset等集合并沒有實現IEnumable<T>接口但是卻實現了IEnumabler接口,這樣的話是不是不能應泛型技術呢,當然這也還是有辦法去處理 的,我們后面會提到。
下面我們看一些linq的基本的操作:
where操作:
功能:條件過濾
操作符聲明:
public static IEnumerable<T> where<T>{
this IEnumerable<T> source,
Func<T,bool> predicate
}
predicate的第一個元素表明了將參與判斷的元素,若該元素判斷通過將返回為true,否則返回false
通過對source的觀察我們也可以發現,where實質為一擴展方法,這個通過this關鍵字已經很明顯的暴露了出來。而predicate的實現實質則是通過委托來做處理,通過對參數predicate的觀察也可以很明顯的反應出來.
同時where還提供了一個重載的版本:
public static IEnumerable<T> where<T>{
this IEnumerable<T> source,
Func<T,int,bool> predicate
}
predicate的第二個參數表示當前元素在源序列中的索引位置(以0為開始)
以下為該重載的一個范例代碼:
IEnumerable<Books> book=samplebooks.where(book,index)=>((book.Name.Contains("2") )&&( (index&1)==1));
以上代碼即為找出名稱中包含2且在序列中奇數位置的圖書
新聞熱點
疑難解答