麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C# 中奇妙的函數(shù) -- 2. First 和 Single -- 你是她心中的第一還是唯一?

2019-11-17 03:35:22
字體:
供稿:網(wǎng)友

Linq中的 First 和 Single 在實(shí)際工作中會(huì)經(jīng)常看到,從字面意思上很容易明白,一個(gè)是取列表中的第一個(gè)元素,一個(gè)是取到唯一的元素。如果你想再進(jìn)一步的了解,可以讀讀本文。

下文參考翻譯自:
C#/.NET Little Wonders: First() and Single() - Similar Yet Different
First() - 返回序列中的第一個(gè)元素
事實(shí)上這個(gè)方法有四種選擇:

First()
返回序列中的第一個(gè),如果沒有元素存在就拋出異常 InvalidOperationException.
First(PRedicate<TSource>)
基于你提供的條件返回序列中的第一個(gè),如果沒有元素存在就拋出異常 InvalidOperationException.
FirstOrDefault()
返回序列中的第一個(gè),如果沒有元素存在就返回默認(rèn)的元素default(TSource).
FirstOrDefault(Predicate<TSource>)
基于你提供的條件返回序列中的第一個(gè),如果沒有元素存在就返回默認(rèn)的元素default(TSource).
First的核心思想是如果序列中存在一個(gè)以上元素的時(shí)候,就返回第一個(gè)。這也意味著當(dāng)發(fā)現(xiàn)第一個(gè)元素的時(shí)候,被調(diào)用的這個(gè)方法就立刻退出了不會(huì)再去遍歷尋找剩下的元素了。

舉例看看,定義一個(gè)類:

  public sealed class Employee

 {

     public long Id { get; set; }

     public string Name { get; set; }

     public double Salary { get; set; }

 }


給他一些初始化的列表:有空的,一個(gè)元素的,多個(gè)元素的

 // 空表

var noEmployeeList = new List<Employee>();

 

// 一個(gè)元素

var oneEmployeeList = new List<Employee>

    {

        new Employee { Id = 55, Name = "Sussie Queue", Salary = 60000.50 }

    };

 

// 多個(gè)元素

var employees = new List<Employee>

    {

        new Employee { Id = 1, Name = "Jim Smith", Salary = 12345.50 },

        new Employee { Id = 7, Name = "Jane Doe", Salary = 31234.50 },

        new Employee { Id = 9, Name = "John Doe", Salary = 13923.99 },

        new Employee { Id = 13, Name = "Jim Smith", Salary = 30123.49 },       

        // ... etc ...

    };


好,當(dāng)我們使用First的時(shí)候,他們會(huì)有什么結(jié)果呢?

 var first = employees.First();
var firstJohn = employees.First(e => e.Name.StartsWith("John"));
var firstDoe = employee.First(e => e.Name.EndsWith("Doe"));


另外請注意在下面的情況下會(huì)拋出異常:

 var empty = noEmployees.First();

var noMatch = employees.First(e => e.Id == 20);

最后,當(dāng)我們使用帶有Default的方法時(shí),下面的情況會(huì)返回空值而不是拋出異常:

 var empty = noEmployees.FirstOrDefault();

var noMatch = employees.FirstOrDefault(e => e.Id == 20);


Single() – 有且僅有一個(gè)
 像First一樣,Single 也有四種表現(xiàn)形式:

Single()
返回序列中的唯一的元素,如果沒有元素存在就拋出異常 InvalidOperationException, 如果多于一個(gè),也拋出異常InvalidOperationException.
Single(Predicate<TSource>)
基于你提供的條件返回序列中的唯一的元素,如果沒有元素存在就拋出異常 InvalidOperationException, 如果多于一個(gè),拋出異常InvalidOperationException.  SingleOrDefault()
SingleOrDefault()
返回序列中的唯一的元素,如果沒有元素存在就返回默認(rèn)的元素default(TSource), 如果多于一個(gè),拋出異常InvalidOperationException.
SingleOrDefault(Predicate<TSource>)
基于你提供的條件返回序列中的唯一的元素,如果沒有元素存在就返回默認(rèn)的元素default(TSource), 如果多于一個(gè),拋出異常InvalidOperationException.
請注意,關(guān)鍵的區(qū)別主要在這里: 如果有一個(gè)以上的元素,這個(gè)家族的方法會(huì)永遠(yuǎn)拋出InvalidOperationException異常。  還要注意,這意味著,即使Single 方法得到了一個(gè)匹配的元素,它仍然有可能要掃描其余的枚舉。 這可以使 Single 效率要低一點(diǎn)。
下面一些例子返回什么呢?

 var oneAndOnly = oneEmployeeList.Single();

var throwsOnEmpty = noEmployeeList.Single();

var throwsOnMultiple = employeeList.Single();

從下面的例子,我們看到Single 和 First 的相似性, 不同的在于滿足結(jié)果的序列多于一個(gè)元素的情況

 // 得到 ID == 7 的唯一元素

var oneAndOnlyMatch = oneEmployeeList.Single(e => e.Id == 7);

 

// 拋出異常

var throwsOnNoMatches = noEmployeeList.Single(e => e.Id == 999);

 

// 拋出異常

var throwsOnMultipleMatches = employeeList.Single(e => e.Name.EndsWith("Doe"));


// 返回一個(gè)null的元素.

var defaultsOnEmpty = noEmployeeList.SingleOrDefault();

 

// 返回一個(gè)null的元素.

var defaultsOnNoMatch = noEmployeeList.SingleOrDefault(e => e.Id == 999);


結(jié)論
First 和 Single 都有一個(gè)避免當(dāng)沒有元素滿足要求而拋出異常的選擇,當(dāng)你不確定想要獲取的元素是否存在的時(shí)候,可以用…OrDefault(), 因?yàn)?null 可以很好的表示“找到不”。

當(dāng)你不在乎是否有重復(fù)項(xiàng)目或者不可能有重復(fù)元素存在的時(shí)候,可以使用First; 當(dāng)你想要核實(shí)是否有重復(fù)元素存在的時(shí)候當(dāng)然就選擇Single。

謝謝你閱讀本文,更多.NET話題請到:

喜樂的asp.net


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久久久亚洲国产精品 | 成人黄色网战 | 加勒比综合 | 91色成人| 免费看污视频在线观看 | 色就色 综合偷拍区91网 | 久久久99精品视频 | 一级大片久久 | 九九热视频这里只有精品 | 久久久久久久久久久久网站 | 国产瑟瑟视频 | 美女露100%无遮挡 | 亚洲欧美国产精品va在线观看 | 久久第四色 | 国产精品av久久久久久网址 | 麻豆视频在线免费观看 | videos高潮 | 欧美日韩精品中文字幕 | 久久国产综合视频 | 黄色大片免费网站 | 美女很黄很黄免费的 | 亚洲激情91 | 久久久在线免费观看 | 成人免费看毛片 | 一区二区三区在线观看国产 | 一区二区三区欧美日韩 | 日韩大片在线永久观看视频网站免费 | gogo全球大胆高清人露出91 | 久久精品国产99久久久古代 | 美女毛片儿 | aaaaaaa毛片| 亚洲成人久久精品 | 国产午夜精品在线 | 欧美城网站地址 | 看av网址| 91网站永久免费看 | 成年免费看| 国产免费观看一区二区三区 | 国产一级一片免费播放 | av免费在线观看av | 成人444kkkk在线观看 |