Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Sorting a two-dimensional array in C#

0.00/5 (No votes)
7 Mar 2011 7  
A generic routine to sort a two-dimensional array in C# on any column in either order
C#
/// <summary>
/// A generic routine to sort a two dimensional array of a specified type based on the specified column.
/// </summary>
/// <param name="array">The array to sort.</param>
/// <param name="sortCol">The index of the column to sort.</param>
/// <param name="order">Specify "DESC" or "DESCENDING" for a descending sort otherwise
/// leave blank or specify "ASC" or "ASCENDING".</param>
/// <remarks>The original array is sorted in place.</remarks>
/// <see cref="http://stackoverflow.com/questions/232395/how-do-i-sort-a-two-dimensional-array-in-c"/>
private static void Sort<T>(T[,] array, int sortCol, string order)
{
    int colCount = array.GetLength(1), rowCount = array.GetLength(0);
    if (sortCol >= colCount || sortCol < 0)
        throw new System.ArgumentOutOfRangeException("sortCol", "The column to sort on must be contained within the array bounds.");

    DataTable dt = new DataTable();
    // Name the columns with the second dimension index values, e.g., "0", "1", etc.
    for (int col = 0; col < colCount; col++)
    {
        DataColumn dc = new DataColumn(col.ToString(), typeof(T));
        dt.Columns.Add(dc);
    }
    // Load data into the data table:
    for (int rowindex = 0; rowindex < rowCount; rowindex++)
    {
        DataRow rowData = dt.NewRow();
        for (int col = 0; col < colCount; col++)
            rowData[col] = array[rowindex, col];
        dt.Rows.Add(rowData);
    }
    // Sort by using the column index = name + an optional order:
    DataRow[] rows = dt.Select("", sortCol.ToString() + " " + order);

    for (int row = 0; row <= rows.GetUpperBound(0); row++)
    {
        DataRow dr = rows[row];
        for (int col = 0; col < colCount; col++)
        {
            array[row, col] = (T)dr[col];
        }
    }

    dt.Dispose();
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here