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