今天看到了c#中對IEnumerable,Lambda表達式和 Parallel的講解,感覺頗深。想記錄下來,能夠給過往的兄弟提供一些幫助,也給本身的知識進行鞏固。html
1. IEnumerable:程序員
IEnumerable<T>泛型接口支持在制定數據集合上進行迭代操做, 能夠理解爲一種序列或者集合,裏面是某一類型的元素的集合。經常使用的方法以下:express
Aggregate | 對序列應用累加器函數,能夠指定累加方法 |
Sum | 計算序列中全部元素的和,返回值有int、long、float、double、decimal類型,而且能夠指定元素到數值的映射方法 |
Average | 計算序列中全部元素的平均值,返回值有int、long、float、double、decimal類型,而且能夠指定元素到數值的映射方法 |
Max | 計算序列中全部元素的最大值,返回值有int、long、float、double、decimal類型,而且能夠指定元素到數值的映射方法 |
Min | 計算序列中全部元素的最小值,返回值有int、long、float、double、decimal類型,而且能夠指定元素到數值的映射方法 |
All | 檢查是否序列中全部元素都知足條件,能夠指定條件判斷方法。若是全部元素都知足條件返回True,不然返回False |
Any | 檢查序列中是否有任何一個元素知足條件,能夠指定條件的判斷方法。若是有一個以上(含一個)元素知足條件返回True,不然返回False |
Contains | 檢查數據系列中是否包含特定的元素,能夠指定相等比較方法 |
Count | 返回序列中知足指定條件的元素的數量,能夠指定條件判斷方法 |
LongCount | 返回序列中知足指定條件的元素的長數量,能夠指定條件判斷方法 |
Cast | 將IEnumerable中的元素轉換爲指定的數據類型 |
DefaultIfEmpty | 返回序列中指定位置的元素。若是序列爲空,則返回默認的元素值 |
ElementAt | 返回序列中指定索引處的元素 |
ElementAtOrDefault | 返回序列中指定索引處的元素。若是序列爲空,則返回默認值 |
First | 返回序列中知足指定條件的第一個元素,能夠指定條件判斷方法 |
FirstOrDefault | 返回序列中知足指定條件的第一個元素。若是不存在則返回默認值,也能夠指定條件判斷方法 |
Last | 返回序列中知足指定條件的最後一個元素,能夠指定條件判斷方法 |
LastOrDefault | 返回序列中知足指定條件的最後一個元素。若是不存在則返回默認值,也能夠指定條件判斷方法 |
Single | 返回序列中知足指定條件的惟一元素。若是不止一個元素知足條件會引起一場,能夠指定條件判斷方法 |
SingleOrDefault | 返回序列中知足指定條件的惟一元素。若是不存在則返回默認值,若是不止一個元素知足條件會引起一場,能夠指定條件判斷方法 |
Reverse | 反轉序列中元素的順序 |
Distinct | 返回序列中不重複的元素的集合,能夠指定相等比較方法 |
Concat | 鏈接兩個序列,直接首尾相連。返回結果可能存在重複數據 |
Except | 獲取兩個元素集合的差集,能夠指定相等比較方法 |
Intersect | 獲取兩個元素集合的交集,能夠指定相等比較方法 |
Union | 獲取兩個元素集合的並集,能夠指定相等比較方法 |
SequenceEqual | 比較兩個序列是否相等,能夠指定相等比較方法 |
Where | 根據制定條件對集合中元素進行篩選,返回知足條件的元素集合 |
Skip | 跳過序列中指定數量的元素,而後返回剩餘的元素 |
SkipWhile | 跳過序列中知足指定條件的元素,而後返回剩餘的元素,能夠指定條件判斷方法 |
Take | 從序列的開頭返回指定數量的連續元素 |
TakeWhile | 返回從序列開始的知足指定條件的連續元素,能夠指定條件判斷方法 |
ToArray | 從IEnumerable建立一個數組 |
ToList | 從IEnumerable建立一個List |
能夠看到,提供的方法不少,也很實用,好比截斷一個子序列,或者比較序列是否相等等,都是十分有用的。 並且還能夠配合foreach更加簡單有效的遍歷集合中個各個元素。如:編程
// 對集合中各個元素都進行操做,後續再介紹Parallelc#
Parallel.ForEach(testTables, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, record => { mag.Operate(record.key1, record.Path); });數組
2. Parallel語法網絡
在介紹Parallel並行計算以前,還須要先介紹一下Lambda表達式,能讀懂Lambda表達式的,通常就很容易讀懂Parallel並行編程的代碼了。多線程
(如下是MSDN複製過來的說明)Lambda 表達式是一個可用於建立委託或表達式樹類型的匿名函數。 經過使用 lambda 表達式,能夠寫入可做爲參數或返回爲函數調用值的本地函數。 Lambda 表達式對於編寫 LINQ 查詢表達式特別有用。若要建立 Lambda 表達式,必須在 Lambda 運算符 => 左側指定輸入參數(若是有),而後在另外一側輸入表達式或語句塊。 例如,lambda 表達式 x => x * x 指定名爲 x 的參數並返回 x的平方。 您能夠按照如下示例將此表達式分配給委託類型: ide
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } 標準的寫法: (input parameters) => expression, 如: (x, y) => x == y, 其中,左側是輸入參數,右側至關於函數體。此表達式是返回x和y是否相等的判斷表達式。
泛型委託也可使用Lambda表達式: 函數
假設有委託: public delegate TResult Func<TArg0, TResult>(TArg0 arg0);
能夠將委託實例化爲 Func<int,bool> myFunc,其中 int 是輸入參數,bool 是返回值。 始終在最後一個類型參數中指定返回值。 Func<int, string, bool> 定義包含兩個輸入參數(int 和 string)且返回類型爲 bool 的委託。 在調用下面的 Func 委託時,該委託將返回 true 或 false 以指示輸入參數是否等於 5:
Func<int, bool> myFunc = x => x == 5; bool result = myFunc(4); // returns false of course 介紹過Lambda表達式以後,就能夠介紹Parallel的並行語法了。 Parallel.ForEach標準的寫法: Parallel.ForEach(nonGenericCollection.Cast<object>(), currentElement => { // some code here;
});
這個解釋就是從nonGenericCollection.Cast<object>中的每個元素,都運行後面的Lambda表達式代碼,並且是多線程並行方式運行。比起之前的foreach或者for循環效率也頗有了很大的提升。例子:
IEnumerable<TRecord> testTables = warehouse.GetList();
Parallel.ForEach(testTables, rec =>
{
mag.operate(rec.key1, rec.key2, rec.key3);
}
);
首先定義一個IEnumerable<TRecord>的記錄序列,而後後面定義一個Lambda表達式,參數是rec,函數體是大括號中的內容。也就是對於testTables裏的每一個元素都並行的運行函數體中的內容。若是函數體中是一個消耗時間比較長的處理事件,好比網絡傳輸數據等內容,則並行將大大提升運行效率。
Parallel.For標準用法:
Parallel.For(int fromInclusive, int toExclusive, Action<int> body);
表明從fromInclusive到toExclusive中的元素,不斷的並行的執行body中的函數體。例子:
//記錄結果用 List<string> resultData = new List<string>();
Parallel.For(0, testData.Count() - 1, (i, loopState) => { string data = testData[i]; if (data.Contains("a") || data.Contains("abc")) { resultData.Add(data); } });
這種實現方式既使運行效率獲得了提升,並且不須要程序員來維護多線程編程的線程池等內容,大大減輕了多線程編程的困難,提升了編碼效率。
轉自http://www.cnblogs.com/songjiang6940/archive/2013/10/24/songjiang_studyCode.html