【问题标题】:C# multi-dimension array sort based on user inputC#基于用户输入的多维数组排序
【发布时间】:2013-03-30 17:00:42
【问题描述】:

如何在 C# 中对二维数组进行排序

我已经查看了这个问题的其他答案,但它们并没有完全满足我的需要。

数组是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

【问题讨论】:

  • 是交错数组还是多维数组?
  • @NickLarsen 它的多维,每一行总是有列填充
  • 你能使用 LINQ 这对我有用吗使用 LINQ arrayName.OrderBy(item => item[0]).ToArray()。降序排序是 arrayName.OrderByDescending(item => item[0]).ToArray()。
  • 需要使用数组吗?可以重新排序 references 的排序例程可能比重新排序 values 快得多,您必须这样做才能对数组进行就地排序。
  • @DStanley 我得研究参考资料,我以前从未听说过。

标签: c# sorting


【解决方案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");

【讨论】:

  • sortedrows 是一个数组吗?还是我必须转换,我以前看过这个答案,但这让我很困惑。这会转换回数组吗?
  • 基本上它的作用是将所有数据读入一个数据表中,您可以在该数据表上执行功能。如果你想要一个数组,你应该在排序或执行你想在数据集上执行的任何功能后将它转换回数组
  • 谢谢,我会试一试的。 :) 我可以通过string[,] newArray = sortedrows; 将最终数据集转换回数组吗?或者我必须使用一种方法来执行此操作吗?
  • 如果我是正确的,您可以使用 toArray() 将数据表转换回数组
【解决方案2】:

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

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());

【讨论】:

  • 谢谢你,我也试试看。我从来没有想过对二维数组进行排序会如此奇怪,我真的认为 C# 会有一个内置的方法来解决这种问题。干杯:)
  • @Joseph 问题是你想通过它的行来处理二维数组,而不是每个值。如果您从一个锯齿状数组开始,那么它会更合适,因为它在逻辑上是集合的集合,您可以将这些行作为逻辑单元进行排序。我不希望该语言提供这种类型的排序机制。
猜你喜欢
  • 2016-04-22
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多