将2D数组和String数组一起排序

时间:2018-07-26 15:07:35

标签: c# arrays string linq sorting

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

我有一个标准的2D数组(无锯齿)和一个字符串数组。它们是通过2D数组的第一列链接的。

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

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

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

1 个答案:

答案 0 :(得分:0)

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]
  • 处创建新词典