如何按列对二维数组(锯齿状)进行排序[重复]
Posted
技术标签:
【中文标题】如何按列对二维数组(锯齿状)进行排序[重复]【英文标题】:How to sort a 2 dimensional array (jagged) by column [duplicate] 【发布时间】:2020-12-31 17:34:33 【问题描述】:我试图弄清楚如何对二维数组进行排序。我已经看到为其他语言发布的这个问题,但不是 C#。我正在处理一个编码挑战,其中输入是二维数组的形式,我需要按第一列排序。
我正在考虑为二维 int 数组创建一个扩展方法,该方法采用左列或右列的参数,但不确定什么是最好的排序算法。我想我可以将 2D int 数组转换为 SortedDictionary 然后将其转换回来,但如果我再次将其转换回 2D 数组似乎效率低下。最好将其转换为 SortedDictionary 并将其保留在该数据类型中,还是有人对 2D 数组有惊人的排序算法?
public static int[][] Sort(this int[][] a2DArr, bool sortLeftCol = true)
SortedDictionary<int, int> sd = new SortedDictionary<int, int>();
int[][] sorted2Darr = new int[a2DArr.Count()][];
if (sortLeftCol == true)
for (int i = 0; i < a2DArr.Count(); i++)
sd.Add(a2DArr[i][0], a2DArr[i][1]);
for (int i = 0; i < a2DArr.Count(); i++)
sorted2Darr[i][0] = sd.ElementAt(i).Key;
sorted2Darr[i][1] = sd.ElementAt(i).Value;
else //sort by right column
for (int i = 0; i < a2DArr.Count(); i++)
sd.Add(a2DArr[i][1], a2DArr[i][0]);
for (int i = 0; i < a2DArr.Count(); i++)
sorted2Darr[i][0] = sd.ElementAt(i).Value;
sorted2Darr[i][1] = sd.ElementAt(i).Key;
return sorted2Darr;
【问题讨论】:
也许a2DArr.OrderBy(x => x[0])
?
还发现,但是在这里你有一个锯齿状数组(数组的数组),而不是一个多维数组 2D ......这不是一回事:tutorialspoint.com/… & @987654322 @&c-sharpcorner.com/article/how-to-sort
@MichaelRandall 我试过了,但它按第二/右列排序,我需要做的是按左列(第 0 列)排序。我认为 .OrderBy 用于一维数组,但代码 sn-p 似乎对按右列排序很有用。
不确定我是否关注,dotnetfiddle.net/7z89fI
【参考方案1】:
我找到了一个answer posted where someone had asked a similar question,但它是关于 rectangular 数组的。这是一个使用 Array.Sort 和 lambda 表达式的不错的小方法:
Array.Sort(contests, (a, b) => return a[0] - b[0]; );
这将按第一列对二维数组进行排序,并将相应的数据保留在第二列中(如按 ID 对行进行排序)。如果任何行左侧的值相同但右侧的值不同,则它将按这些行中第二列中的值排序。
如果您为第一个值输入 1,那么它将按右列排序:
Array.Sort(contests, (a, b) => return a[1] - b[0]; );
【讨论】:
以上是关于如何按列对二维数组(锯齿状)进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章