国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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

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

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

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

舉例看看,定義一個類:

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

    };


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

 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);

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

 var empty = noEmployees.FirstOrDefault();

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


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

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

 var oneAndOnly = oneEmployeeList.Single();

var throwsOnEmpty = noEmployeeList.Single();

var throwsOnMultiple = employeeList.Single();

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

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


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

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

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

喜樂的asp.net


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 定日县| 霍山县| 东乡族自治县| 吉水县| 日土县| 秀山| 南丰县| 理塘县| 金门县| 江门市| 信宜市| 灵武市| 农安县| 游戏| 北碚区| 靖远县| 灵山县| 察隅县| 玉林市| 宁化县| 张家口市| 咸宁市| 桐乡市| 克拉玛依市| 通州区| 潞西市| 亳州市| 建始县| 门头沟区| 芷江| 刚察县| 武宁县| 景宁| 浑源县| 阿尔山市| 三门县| 额敏县| 蓝山县| 昔阳县| 吴川市| 云阳县|