C#多维数组排序基于用户输入

时间:2013-04-08 14:40:01

标签: c# sorting

如何在C#

中对2D数组进行排序

我已经看过这个问题的其他答案,但他们并没有完全按照我的需要做。

数组为variable height * 5 across

数组包含字符串

我需要基于任一列排序的数组,例如按字母顺序排序第三列,但是必须更新所有其他列。

有谁知道快速简便的解决方案?

我的代码很乱,这是一个缩短的版本:

string[,] tmp = new string[2, 3];//this is filled with strings
string y = Console.ReadLine();
int x = Convert.ToInt32(y);

// sort tmp based on x column

2 个答案:

答案 0 :(得分:1)

How do I sort a two-dimensional array in C#?包含一个可能的解决方案,将数据读入数据表,然后使用对象的方法进行排序:

// assumes stringdata[row, col] is your 2D string array
DataTable dt = new DataTable();
// assumes first row contains column names:
for (int col = 0; col < stringdata.GetLength(1); col++)
{
    dt.Columns.Add(stringdata[0, col]);
}
// load data from string array to data table:
for (rowindex = 1; rowindex < stringdata.GetLength(0); rowindex++)
{
    DataRow row = dt.NewRow();
    for (int col = 0; col < stringdata.GetLength(1); col++)
    {
        row[col] = stringdata[rowindex, col];
    }
    dt.Rows.Add(row);
}
// sort by third column:
DataRow[] sortedrows = dt.Select("", "3");
// sort by column name, descending:
sortedrows = dt.Select("", "COLUMN3 DESC");

答案 1 :(得分:1)

首先,我们要将多维数组转换为表示行的一维数组序列,以便每行可以作为一个单元进行操作:

public static IEnumerable<T[]> GetRows<T>(T[,] array)
{
    for (int i = 0; i < array.GetLength(0); i++)
    {
        T[] row = new T[array.GetLength(1)];
        for (int j = 0; j < row.Length; j++)
        {
            row[j] = array[i, j];
        }
        yield return row;
    }
}

然后我们还需要一个反向的方法,以便在完成后返回多维数组:

public static T[,] ToMultiDimensionalArray<T>(T[][] rows)
{
    T[,] output = new T[rows.Length, rows[0].Length];

    for (int i = 0; i < rows.Length; i++)
        for (int j = 0; j < rows[0].Length; j++)
        {
            output[i, j] = rows[i][j];
        }
    return output;
}

现在我们只需要对一系列数组进行排序,而Linq使这很简单:

tmp = ToMultiDimensionalArray(GetRows(tmp)
    .OrderBy(row => row[2]).ToArray());