C# IEnumerable,Lambda表達式和 Parallel並行編程的用法

今天看到了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

相關文章
相關標籤/搜索