86

How do you retrieve the last element of an array in C#?

John T
  • 23,735
  • 11
  • 56
  • 82
MAC
  • 6,277
  • 19
  • 66
  • 111
  • are you looking for how to retrieve the value stored in the last spot of the array, or the actual value of the index? – Nader Shirazie Jun 29 '09 at 05:59
  • 2
    i mean the index value, that is, started from 0 to n – MAC Jun 29 '09 at 06:01
  • The title and content ask different questions. – Masea Jun 16 '20 at 04:53
  • Does this answer your question? [Get the first and last item of an array of strings](https://stackoverflow.com/questions/7387396/get-the-first-and-last-item-of-an-array-of-strings) – TylerH Jul 19 '22 at 21:45

13 Answers13

170

LINQ provides Last():

csharp> int[] nums = {1,2,3,4,5};
csharp> nums.Last();              
5

This is handy when you don't want to make a variable unnecessarily.

string lastName = "Abraham Lincoln".Split().Last();
dribnet
  • 2,555
  • 2
  • 18
  • 9
  • 2
    Last is nice but it is very specific to get only the last item. Does C# have something like slice that can be used like `slice(-2)` to get the last 2 or `slice(0,-2)` to get items from the start except the last 2? Then a function like Last would not be needed as one could just do `slice(-1)` as I'm used to do in other languages. – HMR Dec 22 '16 at 04:48
  • 4
    @HMR Yes, see this: https://www.infoq.com/articles/cs8-ranges-and-recursive-patterns – Matthew Steven Monkan May 07 '19 at 07:48
99

With C# 8:

int[] array = { 1, 3, 5 };
var lastItem = array[^1]; // 5
vguzmanp
  • 785
  • 1
  • 10
  • 31
Matthew Steven Monkan
  • 8,170
  • 4
  • 53
  • 71
79

The array has a Length property that will give you the length of the array. Since the array indices are zero-based, the last item will be at Length - 1.

string[] items = GetAllItems();
string lastItem = items[items.Length - 1];
int arrayLength = array.Length;

When declaring an array in C#, the number you give is the length of the array:

string[] items = new string[5]; // five items, index ranging from 0 to 4.
Fredrik Mörk
  • 155,851
  • 29
  • 291
  • 343
  • 13
    This fails when the array has zero items, in which case `(items.Length - 1) == -1` – ftvs Dec 07 '12 at 02:57
  • 9
    In C# 8 there is a new operator for indexing: `char[] arr = {'c', 'b', 'a'}; int a_last = arr[^1]; int b_second_last = arr[^2];` – Andrei Bozantan Sep 23 '20 at 15:54
15

New in C# 8.0 you can use the so-called "hat" (^) operator! This is useful for when you want to do something in one line!

var mystr = "Hello World!";
var lastword = mystr.Split(" ")[^1];
Console.WriteLine(lastword);
// World!

instead of the old way:

var mystr = "Hello World";
var split = mystr.Split(" ");
var lastword = split[split.Length - 1];
Console.WriteLine(lastword);
// World!

It doesn't save much space, but it looks much clearer (maybe I only think this because I came from python?). This is also much better than calling a method like .Last() or .Reverse() Read more at MSDN

Edit: You can add this functionality to your class like so:

public class MyClass
{
  public object this[Index indx]
  {
    get
    {
      // Do indexing here, this is just an example of the .IsFromEnd property
      if (indx.IsFromEnd)
      {
        Console.WriteLine("Negative Index!")
      }
      else
      {
        Console.WriteLine("Positive Index!")
      }
    }
  }
}

The Index.IsFromEnd will tell you if someone is using the 'hat' (^) operator

rzk3
  • 183
  • 1
  • 5
8

Use Array.GetUpperBound(0). Array.Length contains the number of items in the array, so reading Length -1 only works on the assumption that the array is zero based.

sisve
  • 19,501
  • 3
  • 53
  • 95
  • 4
    Aren't all arrays in C# zero based? – mgttlinger Mar 21 '13 at 13:15
  • @mgttlinger, most of them are, but you can create non-zero-based arrays with http://msdn.microsoft.com/en-us/library/x836773a.aspx, or you may experience them when communicating with libraries written in other languages. – sisve Mar 21 '13 at 14:29
  • Awesome! Why isn't this up-voted (it's up to 3 with my vote at the time of this comment)? It's by far the most elegant, non-LINQ solution. – seebiscuit Feb 11 '14 at 15:00
  • 1
    UPDATE: The GetUpperBound(0) function will only return an `int`. It may not return what the user expects for other numerical arrays, and not all for non-numerical arrays. That's why this isn't up-voted past 3. – seebiscuit Feb 11 '14 at 16:01
4

To compute the index of the last item:

int index = array.Length - 1;

Will get you -1 if the array is empty - you should treat it as a special case.

To access the last index:

array[array.Length - 1] = ...

or

... = array[array.Length - 1]

will cause an exception if the array is actually empty (Length is 0).

sharptooth
  • 167,383
  • 100
  • 513
  • 979
4

Also, starting with .NET Core 3.0 (and .NET Standard 2.1) (C# 8) you can use Index type to keep array's indexes from end:

var lastElementIndexInAnyArraySize = ^1;
var lastElement = array[lastElementIndexInAnyArraySize];

You can use this index to get last array value in any length of array. For example:

var firstArray = new[] {0, 1, 1, 2, 2};
var secondArray = new[] {3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5};
var index = ^1;
var firstArrayLastValue = firstArray[index]; // 2
var secondArrayLastValue = secondArray[index]; // 5

For more information check documentation

Matthew Steven Monkan
  • 8,170
  • 4
  • 53
  • 71
picolino
  • 4,856
  • 1
  • 18
  • 31
  • 1
    More on indices - A special value ^0 reduces to length of an array. So firstArray[^0] gives 'Index was outside the bounds of the array.' exception! – MBB Jun 02 '20 at 17:02
3

The following will return NULL if the array is empty, else the last element.

var item = (arr.Length == 0) ? null : arr[arr.Length - 1]
Matthew Steven Monkan
  • 8,170
  • 4
  • 53
  • 71
Nippysaurus
  • 20,110
  • 21
  • 77
  • 129
  • 2
    This could also be written as `var item = (arr.Length == 0) ?? arr[arr.Length - 1]`. –  Sep 25 '11 at 10:07
  • 3
    @user215361 No, that is invalid C#. Your example will result in: `error CS0019: Operator '??' cannot be applied to operands of type 'bool' and 'int'` – Matthew Steven Monkan Mar 12 '19 at 01:56
2

say your array is called arr

do

arr[arr.Length - 1]
Cambium
  • 19,152
  • 3
  • 26
  • 19
1

Is this worth mentioning?

var item = new Stack(arr).Pop();
Matthew Steven Monkan
  • 8,170
  • 4
  • 53
  • 71
Imad
  • 7,126
  • 12
  • 55
  • 112
1

This is simplest and works on all versions.

int[] array = { 1, 3, 5 };
int last = array[array.Length - 1];
Console.WriteLine(last);
// 5
Akap official
  • 21
  • 1
  • 3
0

Array starts from index 0 and ends at n-1.

static void Main(string[] args)
{
    int[] arr = { 1, 2, 3, 4, 5 };
    int length = arr.Length - 1;   // starts from 0 to n-1

    Console.WriteLine(length);     // this will give the last index.
    Console.Read();
}
fcdt
  • 2,371
  • 5
  • 14
  • 26
0
  static void Main(string[] args)
    {

        int size = 6;
        int[] arr = new int[6] { 1, 2, 3, 4, 5, 6 };
        for (int i = 0; i < size; i++)
        {

            Console.WriteLine("The last element is {0}", GetLastArrayIndex(arr));
            Console.ReadLine();
        }

    }

    //Get Last Index
    static int GetLastArrayIndex(int[] arr)
    {
        try
        {
            int lastNum;
            lastNum = arr.Length - 1;
            return lastNum;
        }
        catch (Exception ex)
        {
            return 0;
        }
    }