星期三, 7月 27, 2022

[LINQ] Single、SingleOrDefault

以前對於 SingleOfDefault() 的認知是都不會拋出 Exception,直到踩到坑才發現,原來是空集合時會回傳預設值,萬一找出超過一個以上的資料,還是會拋出 Exception,重新認識 Single()、SingleOrDefault() 並筆記

SingleOrDefault 官方文件上說明

四種多載超過一個情況下都會拋出 Exception 的

[LINQ] Single、SingleOrDefault-1


簡易範例

用 LinqPad 來筆記語法
void Main()
{
	string[] fruits = { "apple", "banana", "mango", "orange", "passionfruit", "grape" };
	string[] emptyFruits = {};
	string defaultEmptyMessage = "no more fruits";
	
	"---------- Single 範例".Dump();
	
	fruits.Single(fruit => fruit == "apple").Dump("單一水果 apple 符合條件");
	
	try
	{	        
		emptyFruits.Single();
	}
	catch (InvalidOperationException ex)
	{
		ex.Message.Dump("空值拋出 InvalidOperationException");
	}
	
	emptyFruits.DefaultIfEmpty(defaultEmptyMessage).Single().Dump("使用 DefualtIfEmpty 避免 exception 發生");
	
	try
	{
		fruits.Single(fruit => fruit.Length > 15);
	}
	catch (InvalidOperationException ex)
	{
		ex.Message.Dump("沒有任何水果字母長度大於 15,拋出 InvalidOperationException");
	}

	"---------- SingleOrDefault 範例".Dump();

	fruits.SingleOrDefault(fruit => fruit == "orange").Dump("單一水果 orange 符合條件");

	emptyFruits.SingleOrDefault().Dump("空值,回傳預設值");
	
	emptyFruits.SingleOrDefault(defaultEmptyMessage).Dump("空值,回傳指定預設值");
	
	fruits.SingleOrDefault(fruit => fruit.Length > 10).Dump("長度大於 10 的水果");

	fruits.SingleOrDefault(fruit => fruit.Length > 15 , defaultEmptyMessage).Dump("沒有長度大於 15 的水果,回傳指定預設值");

	try
	{
		fruits.SingleOrDefault();
	}
	catch (InvalidOperationException ex)
	{
		ex.Message.Dump("超過一個水果符合條件,拋出 InvalidOperationException");
	}
}

Single 範例執行結果

[LINQ] Single、SingleOrDefault-2

SingleOrDefault 範例執行結果

[LINQ] Single、SingleOrDefault-3

沒有留言:

張貼留言