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

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

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

public Program()
{
List<Student> allStudent = new List<Student> {
new Student("張三",23),
new Student("李四",29),
new Student("王二",25),
new Student("趙六",26)
};
//Ling表示式
var stus1 = from s in allStudent
where
s.Name == "王二" select new { s.Name, s.Age }; //Lanmbda表示式 var stus2 = allStudent.Where(t => t.Name == "王二").Select(t => new { t.Name, t.Age }); } public class Student { public string Name { set; get; } public int Age { set; get; } public Student(string name, int age) { this.Name = name;
this.Age = age; } } Lambda確實比Linq表示式更加優雅 Linq表示式的select不能省略 //Linq var students1 = from t in db.Students where t.Name == "張三" select t; //Lambda var students2 = db.Students .Where(t => t.Name == "張三"); Linq表示式必須需要括號包裹起來才能取結果集 //Linq var students1 = (from t in db.Students where t.Name == "
張三" select t).ToList(); //Lambda var students2 = db.Students .Where(t => t.Name == "張三") .ToList();

什麼時候使用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

[.net core自我修煉2]SQL、LINQLambda表示式

隨便說說 自己想到什麼就記錄下來了,都是自己遇到的技術點,湊合看吧。在寫後端的時候,最常用的是Lambda表示式,這就記錄一下SQL、LINQ和Lambda的不同之處。 參考資料:https://blog.csdn.net/u010926964/article/details/46240

c++ 11 陣列 lambda表示式 語法 / 函式包裝器 基本用法

//倒敘遍歷陣列並輸出  // []裡面的變數可以當做返回值來理解 (int x) 這裡就是每次迭代器的值,也就是陣列的元素的值 void main() { array<int, 5>

關於LINQ lambda表示式

一LINQ :    既可以實現過濾資料(和lambda一樣)也可以實現查詢其他型別資料的功能 LINQ表示式的from行可以巢狀  實現表多層關聯一層層向下找的目的  (注意一對一還是一對多的對應關係 容易亂  別把上層過濾掉的內容又關聯回來了)   過濾完要ToList

C# 中使用LinqLambda表示式對List進行排序

C#中List<T>排序的兩種方法 List<Student> stu = (List<Student>)Session["StudentList"]; Lin

執行緒池lambda表示式

執行緒池1.什麼是執行緒池.一個用來建立和管理執行緒的容器;2.執行緒池的作用.提高執行緒的複用性,降低資源消耗提高執行緒的響應速度,提高執行緒的可管理性3.執行緒的核心思想;執行緒的複用 4.執行緒池的建立ExecutorService pools = Executors.newFixedThreadPoo

18.Java語言執行緒池Lambda表示式

執行緒等待喚醒機制 1.執行緒間的通訊:        一個程式完成某個任務,需要多個執行緒協調,就需要執行緒之間存在“通訊”,比如生產者和消費者,只有生產了才能被消費。當生產者生產完成才能告知消費者可以消費,那麼告知的過程就是執行緒間的通訊。 2.等待與喚醒機制:

匿名內部類lambda表示式

以下內容為筆者在學習過程中對相關知識點的理解和實踐的記錄,如有謬誤,還請指出。 一、匿名內部類:我看到很多人有提到“匿名內部類是沒有名字的類”,個人覺得用陳國君主編的《Java程式設計基礎(第五版)》中的 “所謂匿名內部類,是指可以利用內部類建立沒有名稱的物件,它一步完成了

Collections.sort()方法lambda表示式結合實現集合的排序

1.使用Collections.sort()實現集合的排序,這裡的方法具體指的是:   Collections.sort(List list, Compatator c)       第一個引數:為要進行排序的集合。     第二個引數:Compatator的實現,指定排序的方式。   2

Java8新特性 利用流Lambda表示式對List集合進行處理

Lambda表示式處理List 最近在做專案的過程中經常會接觸到 lambda 表示式,隨後發現它基本上可以替代所有 for 迴圈,包括增強for迴圈。也就是我認為,絕大部分的for迴圈都可以用 lambda 表示式改寫。 lambda表示式有它自己的優點:(1)簡潔,(2)易平行計算。尤其適用於遍歷結果

Java:匿名內部類Lambda表示式

在JDK8之前,將行為抽象化作為引數傳遞給某個物件方法並進行回撥,需要定義一個實現相關介面的型別,如果該型別只需要使用一次,則可通過匿名內部類實現。 在借鑑了C#和Scala後,JDK8引入Lambda表示式,通過減少不必要的模版程式碼,簡化了傳遞抽象化行為程式碼的方式。

JAVA8 匿名內部類lambda表示式

一.匿名內部類   匿名內部類適合建立那種只需要一次使用的類,例如前面介紹命令模式時所需要的Command物件,匿名內部類的語法有點奇怪,建立匿名內部類時會立即建立一個該類的例項,這個類的定義立即消失,匿名內部類不能重複使用。 語法格式一般如下: new 實現介面(

Python中的enumerate函式lambda表示式

Python中的enumerate函式和lambda表示式 Python enumerate()函式 功能:enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。 語法 enumer

C#中非同步匿名委託Lambda表示式

C#中async/await真的是大大簡化了非同步程式的編寫,但往往我們可能忽略了非同步匿名委託和Lambda表示式。直接上程式碼:class Program {     static void Main(string[] args)     {         Func&l

從編譯過程看內部類lambda表示式

什麼是內部類 內部類按名稱分為:匿名內部類,和非匿名內部類。 非匿名內部類又分為:靜態內部類和非靜態內部類。 有時候我們會發現,修改外部類的某個方法使得它訪問了內部類的某個方法,編譯之後就會發現位元組碼中會多出來一個額外的方法,所以為了瞭解原理,還是要看看

c#委託lambda表示式(二)

Lambda表示式 Lambda表示式是一種可用於建立委託或表示式目錄樹型別的匿名函式。通過使用Lambda表示式,可以寫入可作為引數傳遞或作為函式呼叫值返回的本地函式。 若要建立Lambda表示式,需要在Lambda運算子=>左側輸入引數(如果有),

python學習中的reduce()函式lambda表示式

reduce()函式和lambda表示式常常能夠言簡意賅的表達我們想要的公式,但是問題也隨之而來:即表示式嚐嚐難以捉摸,看似高深莫測。這裡,我們簡單地探討一下這兩個表示式。如果後續學習中再次遇到這個問題,會繼續補充。同時,也懇請博友指教和補充,大家共同進步。       首

c#委託lambda表示式(一)

如何使用委託 委託是安全封裝方法的型別,類似於c和c++中的函式指標。與c函式指標不同的是,委託是面向物件的、型別安全的和可靠的。委託型別是由委託的名稱確定。以下是宣告名為Del的委託,該委託可以封裝採用字串作為引數並返回void的方法: public

委託、匿名委託lambda表示式

1、委託 在.NET中,委託有點類似於C/C++中的函式指標,但與指標不同的是,委託是一種安全的型別,那麼我們就以實現兩個數的差為例,先宣告一個成員方法:   publicint CompareTwoValue(int a, int b){ int c=a-b;