Enumerable 的擴充方法 what is different with First、FirstOrDefault、Single、SingleOrDefault?
一、
先了解一下 SingleOrDefault 的用法
SingleOrDefault 有兩種多載方法,分別為
1、public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source);
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string[] fruits1 = { "orange" };
string fruit1 = fruits1.SingleOrDefault();
Console.WriteLine(fruit1);
}
}
}
執行結果為
2 、public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string[] digital = { "123", "12345", "1" };
string d = digital.SingleOrDefault(digital => digital.Length > 2 && digital.Length < 4);
Console.WriteLine(d);
}
}
}
執行結果為
小結:
SingleOrDefault 有兩種多載方法,其差別為一個可以使用表達式來篩資料,另一個則無;
至於 First、FirstOrDefault、Single 的用法也是大同小異的。
二、
Enumerable的擴充方法提供 First、FirstOrDefault、Single、SingleOrDefault 四種方法,
這四種方法主要功能為回傳一筆資料,但之間有什麼差別呢?
答案為
1、First:從集合內回傳第一個元素,如果是空集合會報錯
2、FirstOrDefault:從集合內回傳第一個元素,如果是空集合預設回傳空值
3、Single:與First()功能一樣,當集合裡確定只有一個元素時,可使用Single(),如果集合裡有多個元素則會報錯
4、SingleOrDefault:與First()功能一樣,當集合裡確定只有零個或一個元素時,可使用SingleOrDefault(),如果集合裡有多個元素則會報錯
5、SingleOrDefault 會比 FirstOrDefault 效能還要好。
範例如下:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<string> a = new List<string>() { "a", "b", "c" };
//從集合內回傳第一個元素,如果是空集合會報錯
Console.WriteLine("First = {0}", a.First());
//從集合內回傳第一個元素,如果是空集合預設回傳空值
Console.WriteLine("FirstOrDefault = {0}", a.FirstOrDefault());
//與First()功能一樣,當集合裡確定只有一個元素時,可使用Single(),如果集合裡有多個元素則會報錯
Console.WriteLine("Single = {0}", a.Single());
//與First()功能一樣,當集合裡確定只有零個或一個元素時,可使用SingleOrDefault(),如果集合裡有多個元素則會報錯
Console.WriteLine("SingleOrDefault = {0}", a.SingleOrDefault());
Console.ReadKey();
}
}
}