15,124,353 members
Articles / General Programming / Sorting
Alternative
Tip/Trick
Posted 8 Mar 2011

68.5K views
9 bookmarked

# Sorting a Two-Dimensional Array in C#

Rate me:
16 Mar 2011CPOL
How to sort a two-dimensional array in C#

I'm a fan of Linq and extension methods for things like this. So, how does this look to you?

C#
```public static class MultiDimensionalArrayExtensions
{
/// <summary>
///   Orders the two dimensional array by the provided key in the key selector.
/// </summary>
/// <typeparam name="T">The type of the source two-dimensional array.</typeparam>
/// <param name="source">The source two-dimensional array.</param>
/// <param name="keySelector">The selector to retrieve the column to sort on.</param>
/// <returns>A new two dimensional array sorted on the key.</returns>
public static T[,] OrderBy<T>(this T[,] source, Func<T[], T> keySelector)
{
return source.ConvertToSingleDimension().OrderBy(keySelector).ConvertToMultiDimensional();
}
/// <summary>
///   Orders the two dimensional array by the provided key in the key selector in descending order.
/// </summary>
/// <typeparam name="T">The type of the source two-dimensional array.</typeparam>
/// <param name="source">The source two-dimensional array.</param>
/// <param name="keySelector">The selector to retrieve the column to sort on.</param>
/// <returns>A new two dimensional array sorted on the key.</returns>
public static T[,] OrderByDescending<T>(this T[,] source, Func<T[], T> keySelector)
{
return source.ConvertToSingleDimension().
OrderByDescending(keySelector).ConvertToMultiDimensional();
}
/// <summary>
///   Converts a two dimensional array to single dimensional array.
/// </summary>
/// <typeparam name="T">The type of the two dimensional array.</typeparam>
/// <param name="source">The source two dimensional array.</param>
/// <returns>The repackaged two dimensional array as a single dimension based on rows.</returns>
private static IEnumerable<T[]> ConvertToSingleDimension<T>(this T[,] source)
{
T[] arRow;

for (int row = 0; row < source.GetLength(0); ++row)
{
arRow = new T[source.GetLength(1)];

for (int col = 0; col < source.GetLength(1); ++col)
arRow[col] = source[row, col];

yield return arRow;
}
}
/// <summary>
///   Converts a collection of rows from a two dimensional array back into a two dimensional array.
/// </summary>
/// <typeparam name="T">The type of the two dimensional array.</typeparam>
/// <param name="source">The source collection of rows to convert.</param>
/// <returns>The two dimensional array.</returns>
private static T[,] ConvertToMultiDimensional<T>(this IEnumerable<T[]> source)
{
T[,] twoDimensional;
T[][] arrayOfArray;
int numberofColumns;

arrayOfArray = source.ToArray();
numberofColumns = (arrayOfArray.Length > 0) ? arrayOfArray[0].Length : 0;
twoDimensional = new T[arrayOfArray.Length, numberofColumns];

for (int row = 0; row < arrayOfArray.GetLength(0); ++row)
for (int col = 0; col < numberofColumns; ++col)
twoDimensional[row, col] = arrayOfArray[row][col];

return twoDimensional;
}
}```

Then, to be able to use the code above, you would simply do something like the following:

C#
```int[,] array = new int[3, 3] { { 1, 4, 2 }, { 4, 5, 1 }, { 7, 3, 8 } };

int[,] sortedByFirstElement = array.OrderBy(x => x[0]);
int[,] sortedBySecondElement = array.OrderBy(x => x[1]);
int[,] sortedByThirdElement = array.OrderBy(x => x[2]);```

The keyselector `Func` is merely the way to determine the column to sort on using lambdas.

## About the Author

 Architect United States
Since I've begun my profession as a software developer, I've learned one important fact - change is inevitable. Requirements change, code changes, and life changes.

So..If you're not moving forward, you're moving backwards.

## Comments and Discussions

 First Prev Next
 Nice function BUT Member 1043349624-Feb-19 20:21 Member 10433496 24-Feb-19 20:21
 Reason for my vote of 5 Elegant solution, though not as tran... DrABELL9-Apr-11 13:45 DrABELL 9-Apr-11 13:45
 I would like to see an example of how one would implement th... Tony Zackin10-Mar-11 17:42 Tony Zackin 10-Mar-11 17:42
 Re: While I haven't tested it for performance, it may very well ... Andrew Rissing11-Mar-11 5:14 Andrew Rissing 11-Mar-11 5:14
 Re: Thanks for pointing out the extra ToArray. I have removed it... Andrew Rissing16-Mar-11 10:12 Andrew Rissing 16-Mar-11 10:12
 Last Visit: 31-Dec-99 19:00     Last Update: 7-Dec-21 3:00 Refresh 1

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.