選取
Select:使用給定的Lambda表達式轉換每一個輸入元素,對應SQL語法也是Select
SelectMany:轉換輸入元素, 然後連接各個結果子序列,對應SQL語法是INNER JOIN, LEFT OUTER JOIN, CORSS JOIN
對於LINQ to SQL查詢, Select和SelectMany是最常用的連接構造方法, 而對於本地查詢, Join和GroupJoin才是最有效的連接構造方法.
Select
參數列表:
源序列: IEnumerable
結果選擇器: TSource => TResult或者(TSource,int) => TResult(LINQ to SQL不支持)
使用Select,你總是得到開始操作前相同的元素數量, 然而每一個元素是可以被任何數量的Lambda函數轉換的.
以下的操作列出了電腦中安裝的所有字體名稱(來自於System.Drawing)
1: IEnumerable<string> query = 2: 3: from f in FontFamily.FamilIEs 4: 5: select f.Name; 6: 7: foreach (string name in query) Console.WriteLine (name);
在這個例子當中,select從句將一個FontFamily對象轉換為它的名稱.以下給出了一個相應的Lamdba表達式:
1: IEnumerable<string> query = 2: 3: FontFamily.FamilIEs.Select (f => f.Name);
Select語句經常與匿名類型一起使用:
1: var query = 2: from f in FontFamily.FamilIEs 3: select new 4: { 5: f.Name, 6: LineSpacing = f.GetLineSpacing (FontStyle.Bold) 7: };
有時,一個不含任何轉換的選取會用於一個復合查詢,並以select或者group語句作為結尾. 以下查詢選擇的字體都支持strikeout:
1: IEnumerable query = 2: 3: from f in FontFamily.FamilIEs 4: 5: where f.IsStyleAvailable (FontStyle.Strikeout) 6: 7: select f; 8: 9: 10: 11: foreach (FontFamily ff in query) 12: 13: Console.WriteLine (ff.Name);
索引選取
選擇表達式可以接受一個可選的整數參數,這個參數指示輸入序列中的每個元素的索引位置.以下例子只能在本地查詢中工作:
1: string[] names = { “James”,“Derek”,“Harry”,“Mary”,“Jack” }; 2: 3: IEnumerable<string> query = names 4: 5: .Select ((s,i) => i + “=” + s); 6: 7: foreach(var s in query) 8: 9: Console.WriteLine(s); //0=James, 1=Derek…
子查詢與對象層級
你可以通過在select語句中嵌套一個子查詢來創建一個對象層級.以下示例返回C:\LINQ下的所有目錄, 並且每個元素都擁有一個包含各自目錄文件的子集合:
1: DirectoryInfo[] dirs = 2: 3: new DirectoryInfo (@”C:\LINQ”).GetDirectorIEs( ); 4: 5: var query = 6: 7: from d in dirs 8: 9: where (d.Attributes & FileAttributes.System) == 0 10: 11: select new 12: 13: { 14: 15: DirectoryName = d.FullName, 16: 17: Created = d.CreationTime, 18: 19: Files = 20: 21: from f in d.GetFiles( ) 22: 23: where (f.Attributes & FileAttributes.Hidden) == 0 24: 25: select new { FileName = f.Name, f.Length, } 26: 27: };
此查詢裡面部分可以被稱為相關子查詢.當一個子查詢引用了外部查詢的對象我們可以稱它們是相關的-在這個例子中,它引用了d,代表了被枚舉的目錄.
如果是本地查詢, 一個select裡面的子查詢會引起雙延遲執行. 在我們的例子中,目錄下的文件不會被選取直到內部foreach表達式被枚舉執行.