将二维数组和字符串数组一起排序



所以我有一个特殊的问题。

我有一个标准的2D数组(非锯齿状(和一个字符串数组。它们是链接的,比如说通过2D阵列的第一列。

这意味着我想将它们排序在一起(这不是一个基于键的系统,所以我不能将列用作字符串数组中的键,只要2D数组中的一行移动,字符串数组的等效行中的值也会移动(。

不确定这里的最佳解决方案是什么。我尝试过的脏方法是标准的嵌套循环,通过第一列进行排序并相应地移动所有内容。

我只是想知道是否有比这更好的解决方案,也许可以使用Linq之类的东西??

TLDR:

private (int[,], string[]) SortByColumnNames(int[,] array, string[] columnNames)
{
var columnNameToIndex = columnNames.Select((c, index) => Tuple.Create(c, index));
var sortedColumns = columnNameToIndex.OrderBy(ci => ci.Item1, StringComparer.OrdinalIgnoreCase).ToList();
var sortedArray = new int[2, 3];
for (var newColumnIndex = 0; newColumnIndex < sortedColumns.Count; newColumnIndex++)
{
var oldColumnIndex = sortedColumns[newColumnIndex].Item2;
for (var rowIndex = 0; rowIndex < array.GetLength(1); rowIndex++)
{
sortedArray[newColumnIndex, rowIndex] = array[oldColumnIndex, rowIndex];
}
}
var resultColumnNames = sortedColumns.Select(ci => ci.Item1).ToArray();
return (sortedArray, resultColumnNames);
}

理念:

  • 创建结构列表:列名+列索引
  • 按列名排列此数组
  • 新列表将具有有序的列名和旧列索引
  • 创建新的结构并用以下逻辑填充:行应该是相同的,但列应该是新的

换句话说:

  • 我们记得列索引
  • 对列进行排序(不要忘记索引(
  • 创建映射:从旧索引到新索引
  • 创建新字典,其中sortedArray[newColumnIndex, rowIndex] = array[oldColumnIndex, rowIndex]

最新更新