【问题标题】:Sort a 2D array and String array together将二维数组和字符串数组排序在一起
【发布时间】:2019-01-03 15:25:59
【问题描述】:

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

我有一个标准的二维数组(非锯齿状)和一个字符串数组。它们是通过二维数组的第一列链接的。

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

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

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

【问题讨论】:

  • 你能举个例子吗?另外,如果要将它们分类在一起,是否需要更好的结构?一个包含两个的类? (将包含一列和一个字符串,并具有该类的列表)
  • 为什么“标准嵌套循环”很脏?
  • Dictionary<string,int[,]> 在这种情况下会不会更好? dotnetperls.com/sort-dictionary 我假设 OP 正在寻找他的 string[] 和 value[,] 数组之间的列和行关系。像 string[0]="Cell1" Cells[0,0]=0 Cells[0,1]=1 等我想保持简短,因为我还假设 OP 没有听说过 map/dict 如果我上面的假设是正确的,OP 最好具有键/值关系并使用提供的工具
  • 如果你能包含代码来说明你的问题会有所帮助
  • 类似thisthis?

标签: c# arrays string linq sorting


【解决方案1】:

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]

【讨论】:

  • 也试试这个,谢谢你的解决方案。
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多