標籤:get 類 表 name 代碼 c
上次我們說到了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且在序列中奇數位置的圖書