Linq初級學習(標準查詢操做符的使用和調用)

標準查詢操做符

本文章是我最近學習Linq的一些示例,分享給和我同樣剛開始接觸Linq的朋友們做爲一個參考,由於是初學,確定有不少不足,所以但願你們友善提醒,切勿針鋒相對,我會及時改正的~~

目錄

01 投影操做符(Select,SelectMany)數組

02 限制操做符(Where)ide

03 排序操做符(OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse)函數

04 聯接操做符(join,GroupJoin)學習

05 分組操做符(GroupBy)測試

06 串聯操做符(Concat)this

07 聚合操做符(Aggregate,Average,Count,LongCount,Max,Min,Sum)spa

08 集合操做符(Distinct,Union,Intersect,Except)3d

09 生成操做符(Empty,Range,Repeat)code

10 轉換操做符(Cast,OfType,ToArray,ToDictionary,ToList,ToLookup)orm

11 元素操做符(DefaultIfEmpty,ElementAt,ElementAtOrDefault,First,Last,FirstOrDefault,LastOrDefault,Single,SingleOrDefault)

12 相等操做符(SequenceEqual)

13 量詞操做符(All,Any)

14 分割操做符(Skip,SkipWhile,Take,TakeWhile)

 

 

 

01.投影操做符(Select,SelectMany)

(1)Select操做符對單個序列或者集合中的值進行投影,能夠控制從序列中返回指定的列.

方法語法:

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
User[] users = new User[]{
new User(){ Id = 1 , FirstName = " Huang " , LastName = " Cong " , Age = 12 },
new User(){ Id = 2 , FirstName = " Yang " , LastName = " Qiu " , Age = 22 },
new User(){ Id = 3 , FirstName = " Cai " , LastName = " Zheng " , Age = 18 },
new User(){ Id = 4 , FirstName = " Huang " , LastName = " Chao " , Age = 32 },
new User(){ Id = 5 , FirstName = " Teng " , LastName = " Jie " , Age = 12 },
new User(){ Id = 6 , FirstName = " Liang " , LastName = " Zhi " , Age = 8 }
};

// 使用Select操做符進行投影,對序列只返回First一個列
var query = users.Select(u => new { u.FirstName });

// 輸出
foreach (var q in query)
Console.WriteLine(q.FirstName);
}
}

class User
{
public int Id { get set ; }
public string FirstName { get set ; }
public string LastName { get set ; }
public int Age { get set ; }

public override string ToString()
{
return String.Format( " Id:{0}\tFirstName:{1}\tLastName:{2}\tAge:{3} " this .Id, this .FirstName, this .LastName, this .Age);
}
}
}
查詢語法:
   
   
   
   
var query = from u in users select new { u.FirstName };
運行結果:

 

 

 (2)SelectMany操做符提供了將多個from子句組合起來的功能,它將每一個對象的結果合併成單個序列.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
Names[] owners =
{
new Names { FirstName = " Scott, Chris " ,
Pets
= new List < string > { " Yukon " " Fido " }},
new Names { FirstName = " Jason, Steve " ,
Pets
= new List < string > { " Killer " " Fluffy " }},
new Names { FirstName = " John, Joe " ,
Pets
= new List < string > { " Spike " " Tinkerbell " }}};

// 使用SelectMany操做符將每一個對象的Pets組合成一個序列
var query = owners.SelectMany(owner => owner.Pets);

// 對組合好的Pets進行輸出
foreach (var q in query)
Console.WriteLine(q);
}
}

class Names
{
public string FirstName { get set ; }
public List < string > Pets { get set ; }
}
}

運行結果:

 

02.限制操做符(Where,OfType)

(1)Where是限制操做符,能夠對序列中的值進行過濾.Where操做符不啓動查詢的執行.但開始對對象進行迭代的時候纔將過濾器應用到數據上.

方法語法:

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names = new List < string > ();

names.Add(
" Scott " );
names.Add(
" Dave " );
names.Add(
" Dave " );
names.Add(
" Steve " );
names.Add(
" Joe " );

// 使用Where操做符查詢序列中以S開頭的元素
var query = names.Where(n => n.StartsWith( " S " ));

// 對組合好的Pets進行輸出
foreach (var q in query)
Console.WriteLine(q);
}
}
}

查詢語法:

   
   
   
   
var query = from n in names where n.StartsWith( " S " ) select n;

運行結果:

 

03 排序操做符(OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse)

(1)OrderBy/OrderByDescending操做符能將序列中的返回值按照升序/降序的順序進行排列.

方法語法:

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names = new List < string > ();

names.Add(
" Scott " );
names.Add(
" Dave " );
names.Add(
" Dave " );
names.Add(
" Steve " );
names.Add(
" Joe " );

// 使用OrderBy操做符對序列進行排序
var query = names.Select(n => n).OrderBy(n => n);

Console.WriteLine(
" ----------------------OrderBy排序---------------------- " );
foreach (var q in query)
Console.WriteLine(q);

// 使用OrderByDescending操做符對序列進行倒序
query = names.Select(n => n).OrderByDescending(n => n);

Console.WriteLine(
" ----------------------OrderByDescending排序---------------------- " );
foreach (var q in query)
Console.WriteLine(q);
}
}
}

查詢語法:

   
   
   
   
// 正序
var query = from n in names orderby n select n;

//倒

query = from n in names orderby n descending select n;

運行結果:

 

(2)ThenBy/ThenByDescending操做符可按照次關鍵對序列進行升序/降序排列.

方法語法:

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { get set ; }
public int Age { get set ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();

users.Add(
new User() { Name = " Scott " , Age = 12 });
users.Add(
new User() { Name = " Scott " , Age = 22 });
users.Add(
new User() { Name = " Doe " , Age = 11 });
users.Add(
new User() { Name = " Doe " , Age = 8 });
users.Add(
new User() { Name = " Scott " , Age = 18 });
users.Add(
new User() { Name = " Doe " , Age = 24 });

// 使用ThenBy操做符對序列再次進行排序
var query = users.Select(u => u).OrderBy(u => u.Name).ThenBy(u => u.Age);

Console.WriteLine(
" ----------------------ThenBy排序---------------------- " );
foreach (var q in query)
Console.WriteLine(
" Name:{0}\tAge:{1} " , q.Name, q.Age);

// 使用ThenByDescending操做符對序列再次進行排序
query = users.Select(u => u).OrderBy(u => u.Name).ThenByDescending(u => u.Age);

Console.WriteLine(
" ----------------------ThenByDescending排序---------------------- " );
foreach (var q in query)
Console.WriteLine(
" Name:{0}\tAge:{1} " , q.Name, q.Age);
}
}
}

查詢語法:

   
   
   
   
// 正序
var query = from u in users orderby u.Name, u.Age select u;

// 倒序
query = (from u in users orderby u.Name select u).ThenByDescending(u => u.Age);

運行結果:

 

(3)Reverse操做符只是簡單的把數據源中的數據按照相反的順序返回.(須要注意的是:Reverse在LINQ To SQL中是不支持的).

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names = new List < string > ();

names.Add(
" Scott " );
names.Add(
" Dave " );
names.Add(
" Dave " );
names.Add(
" Steve " );
names.Add(
" Joe " );

// 使用Reverse操做符對序列進行逆序排列
names.Reverse();

foreach (var q in names)
Console.WriteLine(q);
}
}
}

運行結果:

 

04 聯接操做符(join,GroupJoin)

(1)join操做符相似於T-SQL中的inner join,它能夠將一個數據源與另外一個數據源想聯接,根據兩個數據源中相等的值進行匹配.

方法語法:

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { set get ; }
public int RoleId { set get ; }
}

class Role
{
public int Id { get set ; }
public string Name { get set ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();
List
< Role > roles = new List < Role > ();

roles.Add(
new Role() { Id = 1 , Name = " Admin " });
roles.Add(
new Role() { Id = 2 , Name = " Guest " });

users.Add(
new User { RoleId = 1 , Name = " Scott " });
users.Add(
new User { RoleId = 1 , Name = " Dave " });
users.Add(
new User { RoleId = 2 , Name = " Steve " });
users.Add(
new User { RoleId = 2 , Name = " Joe " });

// 查詢出ID爲1的角色下的全部用戶
var query = users.Join(roles, u => u.RoleId, r => r.Id, (u, r) => new { UserName = u.Name, RoleId = r.Id, RoleName = r.Name }).Where(q => q.RoleId == 1 );

foreach (var q in query)
Console.WriteLine(
" UserName:{0}\tRoleId:{1}\tRoleName:{2} " , q.UserName, q.RoleId, q.RoleName);
}
}
}

查詢語法:

   
   
   
   
var query = from r in roles
join u
in users on r.Id equals u.RoleId
where r.Id == 1
select
new { RoleId = r.Id, RoleName = r.Name, UserName = u.Name };

運行結果:

 

(2)GroupJoin操做符相似於T-SQL中的INNER JOIN, LEFT OUTER JOIN,返回的是一個層級的結果集

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { set get ; }
public int RoleId { set get ; }
}

class Role
{
public int Id { get set ; }
public string Name { get set ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();
List
< Role > roles = new List < Role > ();

roles.Add(
new Role() { Id = 1 , Name = " Admin " });
roles.Add(
new Role() { Id = 2 , Name = " Guest " });

users.Add(
new User { RoleId = 1 , Name = " Scott " });
users.Add(
new User { RoleId = 1 , Name = " Dave " });
users.Add(
new User { RoleId = 2 , Name = " Steve " });
users.Add(
new User { RoleId = 2 , Name = " Joe " });

// 查詢全部角色下的用戶
var query = roles.GroupJoin(users, r => r.Id, u => u.RoleId, (role, user) => new { RoleId = role.Id, RoleName = role.Name, Users = user.Where(u => u.RoleId == role.Id) });

foreach (var role in query)
{
Console.WriteLine(
" RoleId:{0} RoleName:{1} " , role.RoleId, role.RoleName);
foreach (var user in role.Users)
{
Console.WriteLine(
" " + user.Name);
}
}

}
}
}

運行結果:

 

05 分組操做符(GroupBy)

(1)GroupBy分組操做符是根據一個指定的特定值將序列中的值或元素進行分組.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { set get ; }
public int RoleId { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();
users.Add(
new User { RoleId = 1 , Name = " Scott " });
users.Add(
new User { RoleId = 1 , Name = " Dave " });
users.Add(
new User { RoleId = 2 , Name = " Steve " });
users.Add(
new User { RoleId = 2 , Name = " Joe " });

// 按RoleId對全部用戶進行分組
var query = users.GroupBy(u => u.RoleId);

foreach (var o in query)
{
Console.WriteLine(
" RoleId:{0}: " , o.Key);
foreach (var user in o)
{
Console.WriteLine(
" Name:{0} " , user.Name);
}
}
}
}
}

運行結果:

 

06 串聯操做符(Concat)

(1)Concat操做符能夠將兩個對象聯接在一塊兒

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { set get ; }
public int RoleId { set get ; }
}

class Role
{
public int Id { get set ; }
public string Name { get set ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();
List
< Role > roles = new List < Role > ();

roles.Add(
new Role() { Id = 1 , Name = " Admin " });
roles.Add(
new Role() { Id = 2 , Name = " Guest " });

users.Add(
new User { RoleId = 1 , Name = " Scott " });
users.Add(
new User { RoleId = 1 , Name = " Dave " });
users.Add(
new User { RoleId = 2 , Name = " Steve " });
users.Add(
new User { RoleId = 2 , Name = " Joe " });

// 按全部的用戶名稱和角色名稱聯接起來
var query = users.Select(u => u.Name).Concat(roles.Select(r => r.Name));

foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

07 聚合操做符(Aggregate,Average,Count,LongCount,Max,Min,Sum)

(1)聚合函數是在序列上執行特定的運算後返回單個值.共有7個聚合查詢操做符:
  Aggregate:將序列中的值進行累積並返回結果.
    Average:計算一個數值序列的平均值.
    Count,LongCount:計算一個集合中元素的個數.可是前者返回的是Int32類型的值,後者爲Int64
    Max,Min:分別是返回序列中的最大值和最小值
    Sum:返回集合中數值的總和

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public string Name { set get ; }
public int Age { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();

users.Add(
new User { Age = 12 , Name = " Scott " });
users.Add(
new User { Age = 22 , Name = " Dave " });
users.Add(
new User { Age = 18 , Name = " Steve " });
users.Add(
new User { Age = 24 , Name = " Joe " });

string Names = " Scott,Dave,Steve,Joe " ;
string [] name = Names.Split( ' , ' );
Console.WriteLine(
" 使用Aggregate將名稱組合起來: " );
string query1 = name.Aggregate((n, next) => n + " " + next);
Console.WriteLine(query1);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用Average求出全部用戶年齡的平均數: " );
var query2
= users.Select(u => u.Age).Average();
Console.WriteLine(query2);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用Count求出總共有多少個用戶: " );
var query3
= users.Count();
Console.WriteLine(query3);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用LongCount求出全部用戶年齡的平均數: " );
var query4
= users.LongCount();
Console.WriteLine(query4);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用Max求出全部用戶年齡的最大數: " );
var query5
= users.Select(u => u.Age).Max();
Console.WriteLine(query5);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用Min求出全部用戶年齡的最小數: " );
var query6
= users.Select(u => u.Age).Min();
Console.WriteLine(query6);
Console.WriteLine(
" ------------------------------------------------ " );

Console.WriteLine(
" 使用Sum求出全部用戶年齡的總和: " );
var query7
= users.Select(u => u.Age).Sum();
Console.WriteLine(query7);
Console.WriteLine(
" ------------------------------------------------ " );
}
}
}

運行結果:

 

08 集合操做符(Distinct,Union,Intersect,Except)

(1)Distinct操做符能夠刪除集合中重複的值,並返回該集合中不相同的元素.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
int [] numbers = new int [] { 1 1 1 2 3 4 5 5 };

// 使用Distinct將數組中重複的元素刪除掉
var query = numbers.Distinct();
foreach (var q in query)
{
Console.WriteLine(query);
}
}
}
}
運行結果:


 

 

(2)Union操做符能夠取兩個集合的互不相同的全部數值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
int [] numbers1 = new int [] { 1 1 1 2 3 4 5 5 };
int [] numbers2 = new int [] { 2 2 3 4 4 5 6 7 };

// 使用Union將兩個數組中重複的元素刪除掉而且合併起來
var query = numbers1.Union(numbers2);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

(3)Intersect操做符能夠返回兩個序列的交集.也就是返回同時存在於2個序列中的值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
int [] numbers1 = new int [] { 1 1 1 2 3 4 5 5 };
int [] numbers2 = new int [] { 2 2 3 4 4 5 6 7 };

// 使用Intersect求兩個集合的交集
var query = numbers1.Intersect(numbers2);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

(4)Except操做符能夠返回兩個序列中不一樣的值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
int [] numbers1 = new int [] { 1 1 1 2 3 4 5 5 };
int [] numbers2 = new int [] { 2 2 3 4 4 5 6 7 };

// 使用Except求numbers1中有可是numbers2中沒有的值
var query = numbers1.Except(numbers2);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

 

09 生成操做符(Empty,Range,Repeat)

(1)Empty操做符能夠返回一個指定類型的空集,一般用來做爲聚合操做符的種子值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
int [] numbers1 = new int [] { 1 2 3 4 5 };
int [] numbers2 = new int [] { 4 5 6 7 };
List
< int [] > numbers = new List < int [] > { numbers1, numbers2 };

// 建立一個空int類型的集合
var empty = Enumerable.Empty < int > ();

// 求numbers1和numbers2中有7這個元素的集合,並輸出具有條件的集合
var query = numbers.Aggregate(empty, (n, next) => next.Contains( 7 ? n.Union(next) : n);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

(2)Range操做符能夠建立一個連續數字序列的集合.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
Console.WriteLine(
" 建立一個1~6的數值集合 " );
var numbers
= Enumerable.Range( 1 6 );

foreach (var q in numbers)
{
Console.WriteLine(q);
}
Console.WriteLine(
" -------------------------------------- " );

Console.WriteLine(
" 倒序 " );
var query
= numbers.Reverse();
foreach (var q in query)
{
Console.WriteLine(q);
}
Console.WriteLine(
" -------------------------------------- " );

Console.WriteLine(
" 輸出1~6的偶數 " );
query
= numbers.Where(u => u % 2 == 0 );
foreach (var q in query)
{
Console.WriteLine(q);
}
Console.WriteLine(
" -------------------------------------- " );
}
}
}

運行結果:

 

(3)Repeat操做符能夠建立一個單值序列,可自定義重複的次數.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 將Good!重複6次
var numbers = Enumerable.Repeat( " Good! " 6 );

foreach (var q in numbers)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

10 轉換操做符(Cast,OfType,ToArray,ToList,ToLookup)

(1)Cast操做符將查詢能夠將IEnumerable中的元素轉換爲指定的類型.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
ArrayList names = new ArrayList();
names.Add(
" Scott " );
names.Add(
" Dave " );
names.Add(
" Steve " );
names.Add(
" Joe " );

// ArrayList不實現IEnumberable(Of T),不可使用標準查詢操做符,
// 可是經過Cast轉換以後就可使用了
var query = names.Cast < string > ().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

(2)OfType操做符能夠對一個序列進行指定類型的過濾.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
ArrayList names = new ArrayList();
names.Add(
" Scott " );
names.Add(
1 );
names.Add(
" Dave " );
names.Add(
2 );
names.Add(
" Steve " );
names.Add(
3 );
names.Add(
" Joe " );

// 經過OfType能夠過濾只能轉換爲int類型的元素
var query = names.OfType < int > ().Select(u => u);
foreach (var q in query)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

(3)ToArray/ToList操做符能夠分別能夠將序列建立爲一個數組或者List<T>對象.須要注意的是進行轉換時會強制查詢當即執行,也就意味着查詢將於源數據斷開聯繫.獲得的序列爲新建立的數組或List<T>.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names = new List < string > ();
names.Add(
" Scott " );
names.Add(
" Dave " );

// 轉換爲Array或者List
var query1 = names.Select(u => u).ToArray();
var query2
= names.Select(u => u).ToList();

Console.WriteLine(
" ToArray: " );
foreach (var q in query1) { Console.WriteLine( " " + q); }
Console.WriteLine(
" ToList: " );
foreach (var q in query2) { Console.WriteLine( " " + q); }
Console.WriteLine(
" --------------------------------------------- " );
// 添加新元素
names.Add( " Steve " );
names.Add(
" Joe " );

// 再次輸出,可是並無後面添加的元素,說明查詢與源數據已斷開聯繫
Console.WriteLine( " ToArray: " );
foreach (var q in query1) { Console.WriteLine( " " + q); }
Console.WriteLine(
" ToList: " );
foreach (var q in query2) { Console.WriteLine( " " + q); }
}
}
}

運行結果:

 

(4)ToDictionary/ToLookUp能夠將序列分別轉換爲一對一的Dictionary<T Key,T Value>字典,或者一對多的LookUp<T Key,TElement Values>字典.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public int Id { set get ; }
public string Name { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();

users.Add(
new User { Id = 1 , Name = " Scott " });
users.Add(
new User { Id = 2 , Name = " Scott " });
users.Add(
new User { Id = 3 , Name = " Doe " });
users.Add(
new User { Id = 4 , Name = " Doe " });

Dictionary
< int , User > query1 = users.ToDictionary(u => u.Id);
ILookup
< string , User > query2 = users.ToLookup(u => u.Name);

Console.WriteLine(
" ToDictionary示例: " );
foreach (var q in query1)
{
Console.WriteLine(
" Key:{0}\tUserName:{1} " , q.Key, q.Value.Name);
}
Console.WriteLine(
" ------------------------------------------------- " );

Console.WriteLine(
" ToLookup示例: " );
foreach (var q in query2)
{
Console.WriteLine(
" Key:{0} " , q.Key);
foreach (var item in q)
{
Console.WriteLine(
" \tUserId:{0}\tUserName:{1} " , item.Id, item.Name);
}
}
}
}
}

運行結果:

 

11 元素操做符(DefaultIfEmpty,ElementAt,ElementAtOrDefault,First,Last,FirstOrDefault,LastOrDefault,Single,SingleOrDefault)

(1)DefaultIfEmpty操做符將一個空集合替換爲包含默認值的集合.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public int Id { set get ; }
public string Name { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
List < User > users = new List < User > ();

// 若是沒有任何用戶信息,返回一個默認值
var query = users.DefaultIfEmpty( new User() { Id = 0 , Name = " None " });

foreach (var q in query)
{
Console.WriteLine(
" UserId:{0}\tUserName:{1} " , q.Id, q.Name);
}
}
}
}

運行結果:

 

(2)ElementAt操做符返回集合中給定索引處的元素,若是索引超出範圍則會拋出一個index out of range的錯誤,若是不能肯定索引範圍,應使用ElementAtOrDefault操做符,ElementAtOrDefault操做符會在索引超出範圍時返回一個默認值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public int Id { set get ; }
public string Name { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
string [] names = new string [] { " Scott " " Dave " " Steve " " Joe " };

string name1 = names.ElementAt( 1 );
string name2 = names.ElementAtOrDefault( 8 );

// 返回索引爲1的元素
Console.WriteLine(name1);
// 操做範圍,返回默認值null,若是爲數值類型返回0
Console.WriteLine(name2);
}
}
}

運行結果:

 

(3)First/Last操做符分別是返回集合中的第一個/最後一個元素,若是不肯定是否有第一個或者最後一個值,可使用FirstOrDefaule/LastOrDefault,它們分別會在First/Last操做符找不到元素的時候返回默認值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public int Id { set get ; }
public string Name { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
string [] names = new string [] { " Scott " " Dave " " Steve " " Joe " };

// 返回索引爲0的元素
string name1 = names.First();
// 返回索引爲0,而且首字母爲T的元素,若是沒有則返回默認值null
string name2 = names.FirstOrDefault(u => u.StartsWith( " T " ));
// 返回集合中最後一個元素
string name3 = names.Last();
// 返回集合中最後一個,而且首字母爲T的元素,若是沒有則返回默認值null
string name4 = names.LastOrDefault(u => u.StartsWith( " T " ));

Console.WriteLine(name1);
Console.WriteLine(name2);
Console.WriteLine(name3);
Console.WriteLine(name4);
}
}
}

運行結果:

 

(4)Single操做符能夠從一個序列中返回惟一知足某個特定條件的元素,若是找不到匹配的元素或者序列返回多個符合條件的元素,都會拋出異常.若是但願找不到元素時返回一個默認值,可使用SingleOrDefault操做符.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
class User
{
public int Id { set get ; }
public string Name { set get ; }
}

static void Main( string [] args)
{
// 建立測試數據
string [] names = new string [] { " Scott " " Dave " " Steve " " Joe " };

// 返回集合中以D爲首字母的元素
string name1 = names.Single(s => s.StartsWith( " D " ));
// 返回集合中以O爲首字母的元素,若是沒有則返回默認值null
string name2 = names.SingleOrDefault(s => s.StartsWith( " O " ));

Console.WriteLine(name1);
Console.WriteLine(name2);
}
}
}

運行結果:

 

12 相等操做符(SequenceEqual)

(1)SequenceEqual操做符能夠斷定兩個集合是否相等,返回值爲Boolean值.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names1 = new List < string > { " Scott " " Dave " " Steve " " Joe " };
List
< string > names2 = new List < string > { " Scott " " Dave " " Steve " " Joe " };

bool equal1 = names1.SequenceEqual(names2);
names1.Add(
" add " );
bool equal2 = names1.SequenceEqual(names2);

Console.WriteLine(equal1);
Console.WriteLine(equal2);
}
}
}

運行結果:

 

13 量詞操做符(All,Any)

(1)All操做符判斷集合中全部元素是否知足特定的條件.若是均知足返回True,不然False.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names1 = new List < string > { " Scoet " " Dave " " Steve " " Joe " };

// 是否均包含字母e
bool all1 = names1.All(u => u.Contains( " e " ));
// 是否均以字母e開頭
bool all2 = names1.All(u => u.StartsWith( " e " ));

Console.WriteLine(all1);
Console.WriteLine(all2);
}
}
}

運行結果:

 

(2)Any操做符判斷集合中是否至少有一個元素知足特定的條件.有則返回True,不然False.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < string > names1 = new List < string > { " Scoet " " Dave " " Steve " " Joe " };

// 是否至少有一個元素是以D開頭的
bool all1 = names1.Any(u => u.StartsWith( " D " ));
// 是否至少有一個元素包含字母i
bool all2 = names1.All(u => u.Contains( " i " ));

Console.WriteLine(all1);
Console.WriteLine(all2);
}
}
}

 

運行結果:

 

14 分割操做符(Skip,SkipWhile,Take,TakeWhile)

(1)Skip操做符會跳過指定數量的元素後返回餘下的元素,SkipWhile操做符則會經過特定的條件跳過一些元素,而後返回餘下的元素.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < int > numbers = new List < int > { 23 4 55 190 5 54 70 };

// 跳過前面3個元素,返回餘下的元素
var query1 = numbers.Skip( 3 );
// 跳過前面不知足"大於50"這個條件的,返回餘下的元素
var query2 = numbers.SkipWhile(u => u < 50 );

foreach (var q in query1)
{
Console.WriteLine(q);
}
Console.WriteLine(
" ---------------------------------------- " );
foreach (var q in query2)
{
Console.WriteLine(q);
}
}
}
}

運行結果:

 

 

(2)Take操做符會返回集合前面指定數量的元素,TakeWhile操做符則會經過特定的條件選取元素,若是某個元素不符合條件,則從該元素起的元素所有跳過.

代碼
    
    
    
    
// -----------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .
// -----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 建立測試數據
List < int > numbers = new List < int > { 23 4 55 190 5 54 70 };

// 獲取前面3個元素
var query1 = numbers.Take( 3 );
// 獲取知足"小於50"這個條件的元素,只要有哪一個不知足,則從該元素起的元素所有忽略
var query2 = numbers.TakeWhile(u => u < 50 );

foreach (var q in query1)
{
Console.WriteLine(q);
}
Console.WriteLine(
" ---------------------------------------- " );
foreach (var q in query2)
{
Console.WriteLine(q);
}
}
}
}

 

運行結果:

 

小結

標準查詢操做符是LINQ查詢表達式的構成模塊,它們提供了許多查詢功能,目前我正在自學這些內容,在此把本身的學習成果分享一下,僅提供給初學者做爲參考用,若是有錯誤的地方請高手指出,我儘快改正~~

做者:小聰崽的一切
出處:http://www.cnblogs.com/huangcong/

相關文章
相關標籤/搜索