前言
提醒:為了能夠將知識點學得更加透徹、記得更加牢固 我會通過教學講解的方式把知識寫下來 因為在程序中會讓人從學生變成老師 這個程序會挖掘出新的知識和觀點 是一個自我思維切換而達成的知識深度挖掘和提升的程序 如果能幫助到大家那就最好 如果有講錯的地方還請多多指教!我只是一只菜雞 感謝理解!
1、初識LINQ
相信大家多多少少都在網上或者書里看到過LINQ這玩意,那它到底是個什么玩意呢?今天就和大家一起來學習下LINQ
LINQ是集成到C#和VB .NET這些語言中用于提供查詢資料能力的一個新特征
在關系型資料庫中,資料被組織放入規范性很好的表中,并且通過簡單而又強大的語言SQL來進行訪問,然而程式中卻與資料庫相反,保存在類物件或結構中的資料差異很大,因此沒有通用的查詢陳述句來從資料結構中獲取資料,自C#3.0引入LINQ后,我們便有了查詢物件資料的能力
就是說LINQ是C#提供給了我們開發者一個快速查詢資料的能力
LINQ-----------讓語言更優美,讓查詢更便捷,讓代碼更出色,
2、簡單的LINQ案例
先來一個示例,讓大伙看看LINQ的魅力所在
要使用LINQ的話就要參考它所在的命名空間 using System.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class GameText
{
public int gameID; //游戲ID
public string gameName; //游戲名稱
public string gameIntduced; //游戲介紹
public int gameSize; //游戲大小
}
class Program
{
static List<GameText> game = new List<GameText>()
{
new GameText(){gameID = 1,gameName = "東湊西湊",gameIntduced = "這是一個2D實習面試專案",gameSize = 1},
new GameText(){gameID = 2,gameName = "同桌的你",gameIntduced = "這是一個青春校園題材的游戲",gameSize = 5},
};
static void Main(string[] args)
{
var res = from m in game
where m.gameID > 1
select m.gameName;
foreach (var item in res)
{
Console.WriteLine(item);
}
}
}
}
主要看這個地方
var res = from m in game
where m.gameID > 1
select m.gameName;
from in 都是關鍵字 game是我們要查詢的資料的物件 m表示game里面的元素
where 是用來做條件限制的 這里我寫了一個m.gameID > 1的條件 意思就是查詢game集合中的gameID大于1的元素
select m.gameName 查出滿足條件的游戲并回傳它的游戲名稱
我們來看下輸出結果

東湊西湊游戲ID為1 同座的你ID為2
where m.gameID > 1
顯然是同座的你這款游戲符合條件 所以最后我們得到的是同座的你這款游戲
看吧是不是很簡單,自己動手敲一下馬上就能理解了!
3、關于LINQ的不同語法
剛剛的案例講的是LINQ運算式的寫法也稱(查詢語法),這里我們還可以使用方法語法來進行資料查詢
查詢語法(query syntax)是宣告形式的,看上去和SQL陳述句很相似,查詢語法使用查詢運算式形式書寫,
方法陳述句(method syntax)是命令形式的,它使用的是標準的方法呼叫,方法是一組叫做標準查詢運算子的方法
只要我們參考了System.Linq; 我們就可以呼叫Where方法
System.Linq命名空間下有一個Enumerable類

Enumerable類為我們開發者提供了超多擴展方法和共享方法,這里面水應該挺深了沒怎么研究跳過,我們直接操作集合然后.呼叫里面的where方法就好了

它需要我們傳入一個Func委托 這里有兩種寫法
一種是用Lambda運算式來做,另一種就是比較麻煩的單獨寫一個方法
先來麻煩的、其實也簡單Where就是做過濾用的,內部會讓集合每個元素都呼叫我們傳進行的方法 所以我們要寫一個引數為GameText、回傳值為bool的方法傳到where中
//var res = from m in game
// where m.gameID > 1
// select m.gameName;
var res = game.Where(whereFunc);
foreach (var item in res)
{
Console.WriteLine(item.gameName.ToString());
}
static bool whereFunc(GameText t)
{
if (t.gameID > 1) return true;
return false;
}
啟動程式 輸出也是 同座的你 沒毛病老鐵
嗯的確也就幾步 不算太麻煩,但是Lambda運算式能讓它更加簡單化
//var res = from m in game
// where m.gameID > 1
// select m.gameName;
//var res = game.Where(whereFunc);
var res = game.Where(g => g.gameID > 1);
foreach (var item in res)
{
Console.WriteLine(item.gameName.ToString());
}
//static bool whereFunc(GameText t)
//{
// if (t.gameID > 1) return true;
// return false;
//}

還是輸出了同座的你 沒毛病!
4、LINQ多表查詢操作
要進行多表操作我們就要學習聯結查詢,學過SQL的同學應該對聯結并不陌生,恰好我只是稍微碰過SQL一下,頭一回學聯結這個知識點,那它到底是個什么玩意呢?
聯結查詢接受兩個集合然后創建一個臨時的物件集合,要想進行聯結操作那就必須每個源物件中需要共享某個可以進行比較,以判斷是否相等的值才可以進行聯結
直接上示例 一看示例就懂了
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Gamer
{
public int id;
public string playName;
}
class GameText
{
public string gameName;
public int id;
}
class Program
{
static List<Gamer> game = new List<Gamer>()
{
new Gamer(){id = 0,playName = "小紅"},
new Gamer(){id = 1,playName = "小黑"},
new Gamer(){id = 2,playName = "小藍"},
new Gamer(){id = 3,playName = "小黃"},
new Gamer(){id = 4,playName = "小小"},
};
static List<GameText> game2 = new List<GameText>()
{
new GameText(){gameName = "東湊西湊",id = 1},
new GameText(){gameName = "東湊西湊",id = 4},
new GameText(){gameName = "同座的你",id = 0},
new GameText(){gameName = "同座的你",id = 2},
new GameText(){gameName = "同座的你",id = 3},
};
}
}
現在我們有兩個類
Gamer存盤的是玩家的ID和名字
GameText存盤的是游戲的名字和游玩此游戲玩家的ID
現在我們單純查game表只能得到玩家的名字和ID并不能查到這個玩家玩的是哪一款游戲,這個時候我們就可以用到LINQ里的聯結操作(join子句)
static void Main(string[] args)
{
var res = from g in game
join g2 in game2 on g.id equals g2.id
where g2.gameName == "同座的你"
select new { playerName = g.playName, gameName = g2.gameName }; //匿名型別物件
//var res = game.Where(g => g.gameID > 1);
foreach (var item in res)
{
Console.WriteLine(item);
}
}
前面幾個關鍵字都解釋過了 這里就講講join的操作

join g2 in game2 這句話完全的意思和 from g in game 一樣的
(這里要注意查詢運算式必須從from子句開始)
from 后面跟的是要做查詢的物件
join 后面跟的是要聯結的物件(表示要和那個集合做聯結)
on 后面是聯結條件
如果g.id 和 g2.id 相等 就判斷下面的條件where g2.gameName == "同座的你"
Gamer存盤的是玩家的ID和名字
GameText存盤的是游戲的名字和游玩此游戲玩家的ID
他們的ID相同并且玩的是同座的你這款游戲那就滿足了查詢條件

回去看回我們的那個表 是不是 小紅 小藍 小黃 這三個人玩的是同座的你這款游戲
嗯輸出的結果 沒毛病
這里好像還有一種叫聯合查詢,我沒有搞懂他們兩個之間的關系,感覺本質上是一樣的也是可以進行多表查詢操作,坐等哪位老哥教教弟弟!
這里我也把聯合查詢的寫出來 其他東西都不需要變
static void Main(string[] args)
{
var res = from g in game
from g2 in game2
where g.id == g2.id && g2.gameName == "東湊西湊"
select new { playerName = g.playName, gameName = g2.gameName };
foreach (var item in res)
{
Console.WriteLine(item);
}
}
不多解釋了 應該不難理解吧,
5、LINQ對查詢結果做排序操作
這里介紹orderby子句
orderby子句接受一個運算式并根據運算式一次回傳結果項
orderby子句默認排序是升序,我們也可以通過ascending和descending關鍵字顯式設定元素的排序為升序還是降序
一起來看看示例
就加了一句orderby g.id descending 其他代碼不變
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Gamer
{
public int id;
public string playName;
}
class GameText
{
public string gameName;
public int id;
}
class Program
{
static List<Gamer> game = new List<Gamer>()
{
new Gamer(){id = 0,playName = "小紅"},
new Gamer(){id = 1,playName = "小黑"},
new Gamer(){id = 2,playName = "小藍"},
new Gamer(){id = 3,playName = "小黃"},
new Gamer(){id = 4,playName = "小小"},
};
static List<GameText> game2 = new List<GameText>()
{
new GameText(){gameName = "東湊西湊",id = 1},
new GameText(){gameName = "東湊西湊",id = 4},
new GameText(){gameName = "同座的你",id = 0},
new GameText(){gameName = "同座的你",id = 2},
new GameText(){gameName = "同座的你",id = 3},
};
static void Main(string[] args)
{
var res = from g in game
join g2 in game2 on g.id equals g2.id
where g2.gameName == "同座的你"
orderby g.id descending
select new { playerName = g.playName, gameName = g2.gameName };
foreach (var item in res)
{
Console.WriteLine(item);
}
}
}
}
因為默認我們ID就是0 1 2 3.. 升序的 所以我們把資料倒序來看看效果

升序狀態下應該輸出的是 小紅小藍小黃
我們用orderby g.id descending 按 g.id來倒序輸出結果
所以輸出了小黃 小藍 小紅
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258617.html
標籤:其他
上一篇:兩數之和
下一篇:流媒體傳輸協議之 RTP(下篇)
