DefaultIfEmpty C# with Example



DefaultIfEmpty C# with Example

DefaultIfEmpty is used to return a Default Element if the Sequence contains no elements. This Element can be the 
Default of the Type or a user defined instance of that Type. Example: 
var chars = new List() { "a", "b", "c", "d" }; 
chars.DefaultIfEmpty("N/A").FirstOrDefault(); // returns "a"; 
chars.Where(str => str.Length > 1) 
.DefaultIfEmpty("N/A").FirstOrDefault(); // return "N/A" 
chars.Where(str => str.Length > 1) 
.DefaultIfEmpty().First(); //  returns  null; 
Usage in Left Joins: 
With DefaultIfEmpty the traditional Linq Join can return a default object if no match was found. Thus acting as a 
SQL's Left Join. Example: 
var leftSequence = new List() { 99, 100, 5, 20, 102, 105 }; 
var rightSequence = new List() { 'a', 'b', 'c', 'i', 'd' }; 
var numbersAsChars = from l in leftSequence 
join r in rightSequence 
on l equals (int)r into leftJoin 
from result in leftJoin.DefaultIfEmpty('?') 
select new 
{ 
Number = l, 
Character = result 
}; 
foreach(var item in numbersAsChars) 
{ 
Console.WriteLine("Num = {0} ** Char = {1}", item.Number, item.Character); 
} 
output: 
Num = 99 Char = c 
Num = 100 Char = d 
Num = 5 Char = ? 
Num = 20 Char = ? 
Num = 102 Char = ? 
Num = 105 Char = i 
In the case where a DefaultIfEmpty is used (without specifying a default value) and that will result will no matching 
 

items on the right sequence one must make sure that the object is not null before accessing its properties. 
Otherwise it will result in a NullReferenceException. Example: 
var leftSequence = new List { 1, 2, 5 }; 
var rightSequence = new List() 
{ 
new { Value = 1 }, 
new { Value = 2 }, 
new { Value = 3 }, 
new { Value = 4 }, 
}; 
var numbersAsChars = (from l in leftSequence 
join r in rightSequence 
on l equals r.Value into leftJoin 
from result in leftJoin.DefaultIfEmpty() 
select new 
{ 
Left = l, 
// 5 will not have a matching object in the right so result 
// will be equal to null. 
// To avoid an error use: 
// - C# 6.0 or above - ?. 
// 
- Under - result == null ? 0 : result.Value 
Right = result?.Value 
}).ToList(); 

0 Comment's

Comment Form

Submit Comment