文章目錄
- linq語言要素:
- 執行查詢:
- linq 之外的集合操作:
- 欄位和屬性的區別:
- 介面:
- 委託和事件:
- 泛型:
1。協變逆變
協變逆變用於介面和委託的泛型參數的一組關鍵字, out 和 in
協變: I<out object> = I<sting>
逆變: I<in string> = I<objet>
ps。泛型執行個體並不存在繼承關係
ps。本質都是調用執行個體演算法。協變介面是開放的,只要實現子類參數的定義,就可以調用特例演算法;逆變介面是封閉的,只能向上調用父類參數的演算法。
協變逆變不支援實值型別參數,不支援ref,out函數形參,不支援作為介面方法的泛型約束。該介面不能嵌套類,枚舉或結構。
協變的參數只能用來做方法的傳回型別,逆變的參數只能用作方法的參數類型。
協變逆變只是限定當前指定對象,不通過繼承來傳遞特性。
定義格式:
interface I<in A, out R>
2。關鍵介面
IEnumerable<out T> : 支援簡單迭代的集合。該介面只是返回IEnumerator<out T>。
IEnumerator<T> GetEnumerator()
IEnumerator<out T>:IDisposable ,
Dispose()
bool MoveNext() :枚舉下一個元素,超過尾部為false
Reset() :只用在com對象。
T Current: 當前位置元素,第一次MoveNext()之後為第一個元素。
IQueryable<out T>:IEnumerable<T> ,支援不同資料來源查詢的類型。
IEnumerator<T> GetEnumerator()
Type ElementType : 元素類型
Expression Expression : 運算式分類樹
IQueryProvider Provider : 建立IQueryable執行個體的提供者
IGrouping<out TKey, out TElement> : IEnumerable<TElement> ,表示具有公用鍵的集合。
IEnumerator<TElement> GetEnumerator()
TKey Key : 鍵
IComparer<in T> : 比較演算法
int Compare(T,T) :負值小於,零等於,正值大於,null小於任何引用
IEqualityComparer<in T> : 相等性演算法
bool Equals(T,T)
int GetHashCode(T) : 若兩對象相等,hash必然相等
IComparable<in T>: 可比較的對象
int CompareTo(T)
IEquatable<in T> : 可比較相等的對象
bool Equals(T)
發現一個規律(不懂英文的人飄過),able結尾的指的是一個對象去實現這個介面,讓它自身具備某種特性。而er之類結尾的,是作為一個參數傳遞給特定方法調用,用來制定所使用的演算法。
3。關鍵委託
Action<in T> : void (T)
Action<in T1, in T2> : void (T1, T2)
Func<out TResult>: TResult ()
Func<in T,out TResult>: TResult (T)
Predicate<in T>: bool (T) , 參數是否符合條件
Comparison<in T>: int (T, T), 比較演算法,和IComparer<in T>的分別是這個是委託,不是對象.
Converter<in TInput, out TOutput>: TOutput (TInput), 轉換演算法
4.LINQ Language-integrated Query (LINQ)
linq三步曲:擷取資料來源、建立查詢、執行查詢。
linq支援查詢IEnumerable<out T> 介面的任意對象。
linq支援建立對資料來源進行聯結、篩選、排序,分組、映射(結構化)的查詢。
linq語言要素:
from :指定資料來源,格式: from 範圍變數 in 資料來源
資料來源:任意實現IEnumerable<out T>的對象
範圍變數:可以用 let 字句添加新的範圍變數,範圍變數只能有一個值或一個運算式定義(可包含另一個範圍變數)。
join : 等同聯結,對沒有顯式建模的序列建立關聯;兩個序列需要可以共用可以判斷是否相等的項;格式:from x in X join y in Y on x.ID equals y.ID
join 只支援等聯結,但有三個形式:內部聯結,分組聯結,左方外部聯結。
內部聯結:第一個集合的元素匹配第二個集合每一個元素,如果第二個集合沒有匹配就不產生結果,有n個匹配項就有n條結果。
into 子句:分組聯結,讓內部聯結的結果類似分組結果,但沒有鍵,本質是多組的序列集合。第一個集合的元素個數為組的個數,第二個集合的匹配項是改組的元素。
.DefaultIfEmpty (defaultObj) : 當匹配為空白時,也就是空序列,調用該函數產生有一個預設元素的序列。這個就是左方外部聯結,基於分組聯結,格式: join…into G from g in G.DefaultIfEmpty(…)
非等同聯結:多個from 引入資料來源,達到交叉聯結的結果;低效率,但是支援let 引入範圍變數,支援菲等同聯結。
where :篩選器,格式:where 條件運算式
orderby : 排序,對結果集進行排序,ascending 升序, descending 降序,格式:orderby 返回序列所指定的排序器 ascending
group: 分組,按指定鍵對序列分組,格式:group 返回的序列 by 分組的鍵
into: 可以用來定義分組結果的範圍變數,以便繼續操作該結果,格式: group x by x.key into xGroup。
select : 映射到結果集
ps。按鍵組合:用多個鍵來定義匹配,鍵匹配取決屬性名稱及順序,但可以分配新名字。
執行查詢:
linq變數只是儲存查詢命令,而具體的查詢操作通過foreach 等語句和相關函數。
ToList<TSource>() : 返回List封裝的結果集
ToArray<TSource(): 返回Array封裝的結果集
第二類是彙總函式(也就是返回單個值):
Count() : 統計結果集條目數
Max() :
Average() : 求序列平均值
First() : 返回結果集的首條內容
……
ps。每個IEnumerable<out T> 對象本身理論上可能只能查詢一次。
linq 之外的集合操作:
標準linq只有聯結、篩選、排序、分組、映射五種操作,因此有些對集合的操作用linq很難實現。
彙總函式:
實現以下功能:元素存在性判斷,集合是否相等,彙總特徵值(最大值,最小值,平均值,個數,總和),提取指定元素
predicate : Func<T,bool>
comparer: IEqualityComparer<T>
coverter : Func<TInput, TOutput>
S : IEnumerable<T>
bool All(predicate) : 集合所有元素是否滿足條件,空集合返回true
bool Any() :如果包含元素返回true
bool Any(predicate) : 包含滿足條件的元素返回true
bool Contains(T) : 判斷序列是否有給定元素,使用Default相等比較子
bool Contains(T, comparer) :同上,指定比較子
bool SequenceEqual(S) : 比較兩序列是否相等
bool SequenceEqual(S, comparer) : 同上,用指定比較子
T Aggregate(Func<T 彙總,T 元素,T 彙總>) :通過迭代自訂彙總
X Aggregate(X 彙總, Func<X 彙總, T 元素, X 彙總>):同上,指定彙總變數
X Aggregate(X, Func<X,T,X>, coverter) : 同上,添加最終彙總的轉換函式
T Average(): 序列平均值,空集合異常
X Average(coverter): 指定轉換函式,求平均值 ,空集合異常
int Count() : 序列元素個數,更大範圍的對應函數:long LongCount()
int Count(predicate) : 滿足條件的元素個數
X Max() : 返回序列中最大的元素,空集合異常,使用IComparable<T>比較介面
X Max(coverter) : 指定轉換函式,返回序列最大的元素
X Min() : 序列最小元素
X Min(coverter):
X Sum() : 序列和
X Sum(coverter) : 經過轉換的序列和
T ElementAt(int) : 返回自定位置的元素
T ElementAtOrDeflault(int) : 同上,超出範圍返回預設值
T First() : 序列第一個元素
T First(predicate): 合格第一個元素
T FirstOrDefault() :返回第一個元素,如無返回預設值
T FirstOrDefault(predicate): 返回合格第一個元素,如無返回預設值
T Last() : 返回序列最後一個元素
T LastOrDefault() : 同上,如無返回預設值
T Last(predicate):
T LastOrDefault():
T Single(): 返回序列唯一的一個元素
T Single(predicate): 返回序列唯一合格一個元素
T SingleOrDefault():如果序列為空白返回預設值
T SingleOrDefault(predicate): 如果都不符合條件,返回預設值
集合轉換:
實現以下功能:串聯,集合操作(差,並,交),去除重複元素,反轉序列,抽取序列段落,產生或者轉換序列
S : IEnumerable<T>
predicate : Func<T,bool>
comparer: IEqualityComparer<T>
S Concat(S): 串聯兩個序列
S Distinct() : 返回不重複元素組成的序列。通過EqualityComparer<T>.Default相等比較子
S Reverse() : 返回反轉元素順序的序列。
S Except(S) : 返回第一個集合和第二個集合的集合差。該操作不符合交換率,通過Default相等比較子
S Except(S, comparer) :同上,指定比較子
S Intersect(S) : 返回兩集合的交集(兩集合共有的元素,並去除重複元素),使用Default比較子
S Intersect(S, comparer): 同上,指定比較子
S Union(S) : 返回兩集合的並集(合集,但去除重複元素),使用Default比較子。
S Union(S,comparer):同上,指定比較子
S Skip(int) : 跳過前n個元素,返回剩餘序列
S SkipWhile(predicate) : 跳過滿足條件的元素,直到遇到不滿足的首個元素,返回剩餘序列
S SKipWhile(Func<T, int, bool>) : 同上,但傳入元素位置給條件函數
S Take(int) : 返回前n個元素組成的序列
S TakeWhile(predicate) : 返回滿足條件的元素組成的序列,直到遇到首個不滿足的元素。
S TakeWhile(Func<T,int,bool>) :同上,傳入元素位置給條件函數
S DefaultIfEmpty() : 返回非空集
S DefaultIfEmpty(T): 返回非空集,指定元素預設值
S Empty() :返回空集
S Range(int start, int count) : 產生指定範圍的整數序列
S Repeat(T, int count): 產生指定個數的重複元素的序列
S AsEnumerable() : 返回基類實現
IQueryable<T> AsQueryable() : 返回IQueryable查詢介面
S OfType() : 轉化為指定類型的序列,如不能轉換的元素自動忽略
T[] ToArray() : 轉化為數組
List<T> ToList():轉化為List
Dictionary<TKEY,TValue> ToDictionary(……) :轉化為字典
Lookup<TKey, TElement> ToLookup(……) :轉化為鍵組合結構序列
5。物件導向
抽象資料類型定義:通過欄位將若干類型按照一定語義組合在一起,形成一個單一類型的方法。
對象:基於抽象資料類型,但對外部操作行為進行限制和幹預,形成一個具有自主權意識的物件類型。
物件導向:不直接操作對象,而基於介面介面操作對象。
對象設計的思想是:保持自主權,減少外界幹預,可以保持個體的正確性,而個體的正確性,保證了系統的正確性。
物件導向設計的思想是:對象對外界的依賴,應該通過介面隔離,當一個外部對象失效的時候,可以通過相同的介面訪問新的對象。
對象設計是基於內部的視角,核心內容是保持自身的正確性,和語義上的內聚性;而物件導向是基於外部的視角,核心內容是降低對象間的耦合度。
物件導向文法要素:
欄位: 為實現語義所需要的資料片段
屬性: 可控的欄位
方法: 可控操作介面,參數化控制對象狀態
建構函式: 對象的初始化
解構函式: 對象的析構
事件: 對象的通訊介面,參數化通訊內容
委託: 委派任務給外部對象
嵌套類: 局部細化對象定義。
存取權限: 控制暴露到外界的介面
靜態成員: 同類共用地區(建議不要暴露)
匿名型別:簡單的抽象資料類型,只能臨時用
介面: 正常化的操作介面(從使用者角度定義)
泛型參數:泛化基礎類型的編程方法,但是每個執行個體都是強型別的。用於類、結構、介面和方法。
實值型別和參考型別:結構和枚舉是實值型別,實值型別以內聯的方式分配,沒有獨立分配,所以是高效能的。
索引器:模仿數組的文法糖。
欄位和屬性的區別:
欄位是不加限制的,屬性是可控的,如果欄位本身是無需控制的,那就可以用欄位,否則應該隱藏欄位,讓屬性作為操作介面。無需控制的含義在於它的取值範圍等於類型的取值範圍;它是獨立,和其他欄位無關和沒有事務關聯的;它不是唯讀或唯寫的。
介面:
介面可由方法、屬性、事件、索引器組合而成。
索引器: T this[T1 index,…]{get;set;}
顯式實現和隱式實現介面的差異:
1、顯式實現的訪問器需要匹配(set;get;) .
2、隱式實現需要公開成員
3、顯式實現無法通過類執行個體訪問,而需要轉化為該介面來訪問
4、顯式實現的事件需要編寫訪問器(add;remove;)
5、顯式實現格式:… 介面名.成員 …
委託和事件:
1、事件通過+= 添加訂閱者,-=刪除訂閱者,無訂閱者事件執行個體為null
2、標準事件基於EventHandler<T>委託:void (object sender, T e) where T:EventArgs
3、可以自訂事件訪問器,格式:
add { lock(事件欄位) {…}} //防止線程問題
remove{lock(事件欄位){…}}
4、靜態事件sender = null ,非靜態sender不為空白。e 不應為空白,可用EventArgs.Empty代替
5、引發事件和處理事件預設是同步的,同時事件處理可能引發未處理的一樣,導致程式崩潰
6、事件和委託的關係類似屬性和欄位的關係。只是事件相對屬性而言,只支援+= 和-=操作而不是賦值和讀取操作。
7、顯式的事件(帶訪問器的)不會自動產生對應的委託和對應的訪問器。
泛型:
可泛型化的對象:介面、類、方法、事件、委託。
泛型約束提供泛型約束的同時也提供了同等的能力,約束和能力是相互的。
泛型參數是引用時只會有一份代碼,而根據不同實值型別會產生對應的代碼。
泛型所有代碼版本邏輯上都是一致的,沒有特列化。
約束:
where T:struct // 只能是實值型別
where T:class // 只能是參考型別
where T:new() // 需要帶預設建構函式
where T:基類或介面
where T:U //U也是泛型參數;T派生自U。
ps。約束告知編譯器得以運用的操作。當約束為class,對象重載的==,!=運算子無效。
ps。無約束參數無法使用!=,==運算子,但可和null比較。
ps。default(T) 產生預設值,實值型別為0,結構成員為0,引用為null
6。lambda
lambda運算式是匿名函數,可以用來建立委託或運算式樹狀架構。
lambda語句(大括弧包含的多行語句)無法用於建立運算式樹狀架構。
例子:
()=>….
x=>…
(x,y)=>…
7。迭代器
迭代器是一個強大的文法糖:通過yield關鍵字立即返回迭代的當前項,產生一個嵌套類記錄當前迭代的位置。迭代器方法最終返回IEnumerable<out T> 或IEnumerator<out T>對象。
迭代器是LINQ延遲查詢的基礎。
迭代器產生的嵌套類能夠根據迭代器方法的內部語句產生對應的邏輯,因此它和手工寫IEnumberable<out T>的相關實現效果是類似的,使用者只需要根據yield的語義大膽使用便可。
ps.迭代器代碼的效率不如手寫代碼。
文法:
yield break //終止迭代
yield return T //返回當前項
注意,不能顧名思義,這裡的yield return並不是當前函數的返回(當前函數直接返回嵌套類對象),而是嵌套類的實現需要這個資訊來設定枚舉返回的項和需要在哪裡暫停執行,哪裡繼續執行。每次枚舉元素對應一次yield return:下一個枚舉在這個語句後面繼續執行,直到碰到下一個yield return才停止執行並返回當前元素。
8。集合和資料結構
.Net集合包含集中常用的資料結構:數組、列表(排序列表)、字典(雜湊表)、隊列,堆棧、包。
每一種集合,可能有幾個不同特性的版本:安全執行緒的集合、已排序的集合、唯讀集合。
安全執行緒的泛型版本:System.Collections.Concurrent
泛型版本:System.Collections.Generic
普通版本:System.Collections
各版本對應關係:
ArrayList 對應 List<T>
Hashtable 對應 Dictionary<TKey, TValue>、ConcurrentDictionary<TKey, TValue>
CollectionBase 對應 Collection<T>
ReadOnlyCollectionBase 對應 ReadOnlyCollection<T>
Queue 對應 Queue<T>、ConcurrentQueue<T>
Stack 對應Stack<T>、ConcurrentStack<T>
SortedList 對應SortedList<T>、ConcurrentSortedList<T>
無普通版的:
LinkedList<T>
SortedDictionary<TKey,TValue>
KeyedCollection<TKey,TItem>
BlockingCollection<T>
ConcurrentBag<T>
集合介面:
1.ICollection
2.IList、IDictionary
ps. 2繼承1
ps。IDictionary的元素需要實現IComparer<T>大小比較子介面
ICollection 的實現:Queue、ConcurrentQueue<T>、Stack、ConcurrentStack<T>、LinkedList<T>、KeyedCollection<TKey,TItem>
IList 的實現:Array、ArrayList、List<T>
IDictionary 的實現:Hashtable、SortedList、Dictionary<TKey,TValue>、SortedList<TKey,TValue>、ConcurrentDictionary<TKey,TValue>
數學集合(元素不重複的集合):
ISet<T>
HashSet<T>
SortedSet<T>
位集合:
BitVector32
BitArray
其他集合:
StringCollection
StringDictionary
CollectionUtil
HybridDictionary
ListDictionary
NameValueCollection
NameObjectCollectionBase
BlockingCollection<T>
IProducerConsumerCollection<T>
ConcurrentBag<T>
9。檔案和註冊表
10。字串和Regex
11。邏輯推理
主題:關於程式正確性的推理方法。
12。組合排列
主題:討論如何窮舉問題域。
13。三角函數
14。結構,演算法,映射關係
主題:對於特定問題應該如何構建演算法效率最高的資料結構。
待續……