亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:35:22
字體:
來源:轉載
供稿:網友

Linq中的 First 和 Single 在實際工作中會經??吹?,從字面意思上很容易明白,一個是取列表中的第一個元素,一個是取到唯一的元素。如果你想再進一步的了解,可以讀讀本文。

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

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

舉例看看,定義一個類:

  public sealed class Employee

 {

     public long Id { get; set; }

     public string Name { get; set; }

     public double Salary { get; set; }

 }


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

 // 空表

var noEmployeeList = new List<Employee>();

 

// 一個元素

var oneEmployeeList = new List<Employee>

    {

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

    };

 

// 多個元素

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 ...

    };


好,當我們使用First的時候,他們會有什么結果呢?

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


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

 var empty = noEmployees.First();

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

最后,當我們使用帶有Default的方法時,下面的情況會返回空值而不是拋出異常:

 var empty = noEmployees.FirstOrDefault();

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


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

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

 var oneAndOnly = oneEmployeeList.Single();

var throwsOnEmpty = noEmployeeList.Single();

var throwsOnMultiple = employeeList.Single();

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

 // 得到 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"));


// 返回一個null的元素.

var defaultsOnEmpty = noEmployeeList.SingleOrDefault();

 

// 返回一個null的元素.

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


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

當你不在乎是否有重復項目或者不可能有重復元素存在的時候,可以使用First; 當你想要核實是否有重復元素存在的時候當然就選擇Single。

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

喜樂的asp.net


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产ts一区二区| 亚洲国产精品悠悠久久琪琪| 在线看国产精品| 精品久久久香蕉免费精品视频| 国产精品高潮呻吟久久av无限| 日韩成人激情影院| 91精品啪在线观看麻豆免费| 国产精品亚发布| 理论片在线不卡免费观看| 欧美另类极品videosbest最新版本| 日本国产精品视频| 亚洲国产天堂久久综合| 国产精品网红直播| 日韩精品在线免费播放| 精品国产91乱高清在线观看| 亚洲网站在线播放| 国产精品高清在线| 精品国内产的精品视频在线观看| 日韩欧美国产骚| 97在线免费观看视频| 国产成人aa精品一区在线播放| 亚洲国模精品一区| 26uuu另类亚洲欧美日本老年| 日韩av中文字幕在线播放| 欧美高清视频在线播放| 国产国产精品人在线视| 青草成人免费视频| 欧洲美女7788成人免费视频| 97视频色精品| 国产精品久久久久久久久久久新郎| 久久久久久久影视| 欧美大片免费观看在线观看网站推荐| 日韩禁在线播放| 中文字幕国产精品久久| 成人av电影天堂| 国产精品免费看久久久香蕉| 日韩欧美一区视频| 久久av资源网站| 国产精品高清在线观看| 中文字幕欧美精品日韩中文字幕| 国产精品视频久久| 国产日韩欧美在线| 国产精品999999| 国产中文字幕亚洲| 国产69久久精品成人看| 91亚洲国产成人精品性色| 精品国产一区二区三区在线观看| 亚洲精品国产综合区久久久久久久| 亚洲一区二区三区xxx视频| 中文字幕亚洲综合久久筱田步美| 亚洲黄一区二区| 欧美一区第一页| 久久精品国产视频| 亚洲精品v欧美精品v日韩精品| 亚洲第一福利视频| 欧美国产第一页| 欧美成人久久久| 91九色国产社区在线观看| 69精品小视频| 欧美精品情趣视频| 国产午夜一区二区| 国产一区二区三区18| 国产手机视频精品| 久久久亚洲网站| 91系列在线观看| 中文字幕欧美日韩在线| 成人免费福利视频| 欧美另类在线观看| 青青在线视频一区二区三区| 久久视频在线视频| 精品中文字幕久久久久久| 欧美肥老妇视频| 久久夜色精品国产欧美乱| 伊人男人综合视频网| 国产精品国产三级国产aⅴ9色| 欧美精品videosex性欧美| 欧美日韩一区二区免费在线观看| 国产精品视频精品| 欧美性猛交xxxx富婆弯腰| 成人精品久久一区二区三区| 91在线观看免费高清| 亚洲成人a级网| 国产精品久久久久久久久久99| 欧美香蕉大胸在线视频观看| 久久男人的天堂| 亚洲黄色免费三级| 91爱视频在线| 亚洲精选中文字幕| 日韩欧美成人免费视频| 久久亚洲影音av资源网| 日韩av一区二区在线| 国内精品久久久久久影视8| 国产成人av在线| 亚洲电影成人av99爱色| 日韩av电影院| 国产日韩精品在线播放| 欧美电影在线观看完整版| 亚洲区免费影片| 亚洲最大福利视频网| 国产a级全部精品| 亚洲第五色综合网| 欧美成人精品影院| 欧美一级成年大片在线观看| 亚洲精品999| 亚洲第一中文字幕在线观看| 美乳少妇欧美精品| 久久亚洲国产精品成人av秋霞| 亚洲欧美日韩一区在线| 一个人www欧美| 最近2019年手机中文字幕| 91高清视频免费| 久久av红桃一区二区小说| 91中文在线观看| 欧美精品videos另类日本| 国产精品久久久久影院日本| 国产成人极品视频| 日韩在线观看免费全| 精品日韩中文字幕| 欧美成人手机在线| 国产69久久精品成人看| 亚洲石原莉奈一区二区在线观看| 亚洲综合在线做性| 高清视频欧美一级| 亚洲18私人小影院| 欧美伦理91i| 国产精品极品美女粉嫩高清在线| 深夜福利国产精品| 欧美人成在线视频| 国精产品一区一区三区有限在线| 欧美综合在线观看| 久久久久国产一区二区三区| 日韩成人av在线| 国产精品小说在线| 久久亚洲精品一区| 欧美一级视频免费在线观看| 国产精品久久久久久久久久小说| 国产精品成人国产乱一区| 亚洲xxxx视频| 97精品视频在线播放| 亚洲黄页视频免费观看| 福利一区福利二区微拍刺激| 久久综合伊人77777尤物| 久久久999国产精品| xxx成人少妇69| 最近2019中文字幕大全第二页| 国产一区二区三区在线| 狠狠久久亚洲欧美专区| 少妇高潮 亚洲精品| 久久久久久久久久久成人| 久久久久久欧美| 亚洲国产97在线精品一区| 国产精品久久久久久久久久新婚| 国产精品视频网站| 日韩av电影手机在线| 欧美在线视频播放| 少妇精69xxtheporn| 欧美激情亚洲一区| 国产精品视频最多的网站| 成人日韩在线电影| 国内精品伊人久久| 亚洲网站视频福利| 亚洲精品久久久久久久久久久久| 中文字幕视频一区二区在线有码| 久久成人18免费网站|