1. 程式人生 > >【C#】Linq表示式和Lambda表示式用法對比

【C#】Linq表示式和Lambda表示式用法對比

什麼是Linq表示式?什麼是Lambda表示式?
前一段時間用到這個只是,在網上也沒找到比較簡單明瞭的方法,今天就整理了一下相關知識,有空了再仔細研究研究

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }

    }
    class Program
    {
        public static List<Person> PersonsList()//方法返回Person類的List集合
        {
            List<Person> persons = new List<Person>();
            for (int i = 1; i < 8; i++)
            {
                //Person p = new Person() { Name = i + "人物年齡", Age = 8 - i, };
                Person p = new Person() { Name ="張"+i, Age = i, }; 
                persons.Add(p);
            }
            return persons;
        }

        static void Main(string[] args)
        {
            List<Person> persons = PersonsList();
            //lanbuda表示式
            //List<Person> persons1 = persons.Where(p => p.Age > 6).ToList();   //所有Age>6的Person的集合
            //Person per = persons.SingleOrDefault(p => p.Age == 1);  //Age=1的單個people類
            //List<Person> persons2 = persons.Where(p => p.Name.Contains("2")).ToList();   //所有Name包含年齡的Person的集合
            //foreach (Person p in persons2)
            //{
            //    Console.WriteLine(p.Name);
            //}

            //Linq表示式 與lanmuda 的對比
            //Linq
            var person01 = from t in persons
                           where t.Name.Contains("張") &&  t.Age==2
                           select t;
            //Lambda
            var person02 = persons.Where(t => t.Name == "張3");

            foreach (Person p in person02)
            {
                Console.WriteLine(p.Age);
            }
        }

    }
}



什麼時候使用Linq?
通過上面的對比,好像Linq一文不值了。no,不是這樣的。
比如下面幾種情況我們就可以選擇使用Linq:
例一:(本例適用於Linq to Object 和 沒有建主外來鍵的EF查詢)
Lambda中的Join需要傳四個引數表示式,是不是有點暈了。。。

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };

//Linq
var obj1 = from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
select new { l1, l2 };
//Lambda
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 });

例二:
Lambda需要區分OrderBy、ThenBy有沒有覺得麻煩

//Linq
var obj1 = from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
orderby l1.Key, l2.Key descending
select new { l1, l2 };
//Lambda
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 })
.OrderBy(li => li.l1.Key)
.ThenByDescending(li => li.l2.Key)
.Select(t => new { t.l1, t.l2 });

總覺得Linq更多的只是為了照顧那些寫慣了sql的程式設計師。

聯接查詢(內聯、左聯、交叉聯)

關於聯接查詢使用Linq會更合適一些這個上面已經說了。
接下來我們寫內聯、左聯、交叉聯的Linq和對應的Lambda程式碼。(目的:可能有些人不會,同時在這裡也給自己做個備忘)
內聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
join l2 in list2
on l1.Key equals l2.Key
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.Join(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2 }).ToList();

左聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
join l2 in list2
on l1.Key equals l2.Key into list
from l2 in list.DefaultIfEmpty()
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.GroupJoin(list2, l1 => l1.Key, l2 => l2.Key, (l1, l2) => new { l1, l2=l2.FirstOrDefault() }).ToList();

交叉聯:

var list1 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "張三" }, { "4", "張三" } };
var list2 = new Dictionary<string, string> { { "1", "張三" }, { "2", "李四" }, { "3", "李四" }, { "4", "張三" } };
//Linq查詢
var ojb2 = (from l1 in list1
from l2 in list2
select new { l1, l2 }).ToList();
//Lambda查詢
var obj = list1.SelectMany(l1 => list2.Select(l2 => new { l1,l2})).ToList();

參考:FROM :http://www.cnblogs.com/zhaopei/p/5746414.html

相關推薦

C#Linq表示式Lambda表示式用法對比

什麼是Linq表示式?什麼是Lambda表示式? 前一段時間用到這個只是,在網上也沒找到比較簡單明瞭的方法,今天就整理了一下相關知識,有空了再仔細研究研究 using System; using System.Collections.Generic; using S

Linq表示式Lambda表示式用法對比

什麼是Linq表示式?什麼是Lambda表示式?前一段時間用到這個只是,在網上也沒找到比較簡單明瞭的方法,今天就整理了一下相關知識,有空了再仔細研究研究 public Program() { List<Student> allStudent = new List<Student&g

C#中的WhereLambda表示式

1 2 3 4 5 6 7 8 9 10 11 List<string> listString = new List<string>(); listString.Add("abc"); listStrin

C++隨機數rand( ) 隨機數引擎

rand() 基本:使用隨機數時,經常見到的是C標準庫提供的函式rand(),這個函式會生成一個0到RAND_MAX(32767)之間的一個整形數; 分佈:為了得到一個給定範圍內的隨機數,通常會對生成的隨機數取餘:rand()%n,rand()%(n-m)+m; 種子:通過

C++初學類物件的概念

C++中的類Class可以看作C語言中結構體的升級版。結構體是一種構造型別,它可以包含若干成員變數,而其中每個成員變數的型別又可以不同。例如: struct Student {//結構體包含的成員變數 char *name; int age; float score; }; void D

C#靜態變數方法該如何使用?

什麼是靜態變數? 簡單的來說就是:用static修飾的變數,它屬於它所在的類所有,而不是具體的某一個物件。 靜態變數也被稱為全域性變數,就是它在程式執行的時候就被初始化,如果你在它初始化或使用的時候,沒有給它賦值,系統就會給它一個預設值。   靜態方法同理,簡單瞭解一下

C#Parallel.For For 誰的效率高呢?

原標題:C# 多執行緒 Parallel.For 和 For 誰的效率高?那麼 Parallel.ForEach 和 ForEach 呢? 今天和大家探討一個問題:Parallel.For 和 For 誰的效率高呢? 從CPU使用方面而言,Parallel.For

C++const char* char* 之間的轉換

const char*是指向常量的指標,而不是指標本身為常量,可以不被初始化.該指標可以指向常量也可以指向變數,只是從該指標的角度而言,它所指向的是常量, 通過該指標不能修改它所指向的資料.  1.const char*是不能直接賦值到char*的,這樣編譯都不能通過,理由

C#面對物件類、構造方法及名稱空間

一、面向物件 1、什麼是面向物件? 面向物件是一種思想,面向物件是將功能等通過物件來實現,將功能封裝進物件之中,讓物件去實現具體的細節,在面向物件中,將資料作為第一位,而方法或者說是演算法作為其次,這是對資料的一種優化,操作起來更加方便,簡化了過程。 2、為什麼要用面向

C++堆記憶體棧記憶體詳解

一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分  1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧  2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回

C++靜態分配動態分配 堆棧(詳解)

但是,在使用陣列的時候,總有一個問題困擾著我們:陣列應該有多大?在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道我們要定義的這個陣列到底有多大,那麼你就要把陣列定義得足夠大。這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道你想利用的空間大小,但是如果因為某種特

C++STL佇列棧的使用

C++的STL標準模板庫提供了佇列和棧的基本操作。下面通過兩個demo分別介紹STL佇列和STL棧的使用。 Demo1:STL佇列 【題目】卡片遊戲(題目來自劉汝佳《演算法競賽入門》) 桌上又一疊牌,

C++boost::bind函式物件一起使用實現便捷的非同步程式設計

     在C++面向物件程式設計中,觀察者模式是大家熟知的實現非同步程式設計的一種模式。      觀察者模式定義物件間的一種一對多的依賴關係,以便當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動更新。如下圖所示:      觀察者模式提供了一種物件設計,

C++vector容器list容器中使用單個迭代器的erase函式學習筆記

例題為:假設有如下ia的定義,ia複製到vector和list中,把list容器中奇數值元素刪除掉,把vector容器偶數值元素刪除掉。 陣列複製採用push_back操作。刪除操作採用了erase函式,由於該函式返回值為指向被刪除元素後面的元素,則使用了返回值賦值回給迭代

C++const物件const成員

如果我們在定義一個物件之後,不希望在後面對這個物件進行修改,那麼我們可以把這個物件宣告為const物件。 宣告為const物件之後,這個物件的所有資料成員後面都不能被修改! const物件 定義類物件時可以將其指定為const物件。定義後c

C++目標檔案可執行檔案裡面都有什麼

編譯器編譯原始碼後生成的檔案叫做目標檔案。 從檔案結構上來講,目標檔案已經是二進位制檔案。 編譯是針對單個原始檔的,有幾個原始檔就會生成幾個目標檔案,並且在生成過程中不受其他原始檔的影響。也就是說,不管當前工程中有多少個原始檔,編譯器每次只編譯一個原始檔、生成一個

C# 陣列排序取值練習

1.從鍵盤接收一行用逗號分隔的5個整數,儲存至有5個元素的陣列中。 2.分別輸出正序和逆序的結果。 3/輸出陣列最大值和平均值,平均值保留1位小數。 4.存在非法輸入時顯示提示訊息並可重新輸入資料。 5.按下回車鍵退出,任意鍵繼續輸入。 輸出結果如圖所示。 -------

C++多檔案專案extern的用法

目錄 extern定義與使用 全域性變數和函式重定義 專案生成過程 extern定義與使用 extern告訴編譯器在某一個cpp檔案中,存在該函式或該全域性變數的定義。 (1)宣告外部函式; (2)宣告外部全域性變數。 程式功能:輸入半徑,求面積。 main.

C#— 基礎函式、運算子表示式

從前人(學習完這個專案的人)那裡聽說傳智播客是北京最大計算機培訓班黑馬的前身,感覺對他的興趣又深了。只要對它有了興趣自然學的就會快了。看C#視訊有一段時間了,小楊老師講課很有意思,一點也不枯燥,幽默風趣還有一點點自戀哈哈哈,好像他快禿頂了。 對於C#視訊就像是我才來提高班學

C#三種轉換字元法、三元表示式、常量列舉結構陣列

一、三種方法轉換字串變成數字 1.1.Parse的使用 這兩個使用結果一樣,當用戶輸入的數字轉換成我們想要的數字型別。 可以使用     Convert.ToInt32(""); 還可以使用  int.Parse("") 1.2.int.TryParse的使用