TheDeveloperBlog.com


C# ElementAtOrDefault, ElementAt Use

ElementAtOrDefault accesses an element. It handles an out-of-range access without throwing an exception. It returns a default value in this case. ElementAt meanwhile will throw an error on nonexistent indexes.


Example. In this program we create a three-element array. The only valid indexes to access are 0, 1 and 2. We show how ElementAtOrDefault works on valid indexes, and also out-of-range indexes.

Tip: On out-of-range accesses, ElementAtOrDefault returns the default value for the type, which for int is 0.

Default
Based on:

.NET 4.5

C# program that uses ElementAtOrDefault

using System;
using System.Linq;

class Program
{
    static void Main()
    {
	int[] array = { 4, 5, 6 };
	int a = array.ElementAtOrDefault(0);
	int b = array.ElementAtOrDefault(1);
	int c = array.ElementAtOrDefault(-1);
	int d = array.ElementAtOrDefault(1000);

	Console.WriteLine(a);
	Console.WriteLine(b);
	Console.WriteLine(c);
	Console.WriteLine(d);
    }
}

Output

4
5
0
0

Conceptually, ElementAtOrDefault can make a collection be infinite. It can make every possible index returning a valid value—the default value—if it is not actually present in memory.

And: This could be useful if a collection is queried for invalid indexes, and actual stored values are not necessary for the algorithm.


ElementAt gets an element at an index. In many IEnumerable types, you cannot directly index a certain element. Instead of using a foreach-loop or other techniques, we can use the ElementAt method from System.Linq.

To start: This program uses an array of three string literal elements. Arrays are IEnumerable collections.

ArraysIEnumerable

And: We can index this array through the ElementAt method in the System.Linq namespace.

Warning: The method call with argument 3 throws a System.ArgumentOutOfRangeException.

ArgumentOutOfRangeException
C# program that uses ElementAt method

using System;
using System.Linq;

class Program
{
    static void Main()
    {
	// Input array.
	string[] array = { "Dot", "Net", "Perls" };

	// Test ElementAt for 0, 1, 2.
	string a = array.ElementAt(0);
	Console.WriteLine(a);
	string b = array.ElementAt(1);
	Console.WriteLine(b);
	string c = array.ElementAt(2);
	Console.WriteLine(c);

	// This is out of range.
	string d = array.ElementAt(3);
    }
}

Output

Dot
Net
Perls

Unhandled Exception: System.ArgumentOutOfRangeException:
    Index was out of range.

This program does not demonstrate real-world usage of the ElementAt method. In this program, we could just directly use the indexer on the array variable itself. It does show the syntax of the method call and a possible exception.

However: If for some reason we only knew the type of the collection was IEnumerable, we could more realistically use ElementAt.


Summary. These methods can transform how we access collections. ElementAtOrDefault eliminates the need for bounds-checking. But it could create extra complexity if we need to add special casing for the default value.