二维数组按某列排序
Posted 葛芋佳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组按某列排序相关的知识,希望对你有一定的参考价值。
1 using FrameWork.IoC.Achieve.IoCAbstractBasics; 2 using FrameWork.IoC.Achieve.IoCBasics; 3 using FrameWork.IoC.Case.Test; 4 using FrameWork.IoC.Case.Test.TestOne; 5 using FrameWork.IoC.Case.Test.TestTwo; 6 using System; 7 using System.Collections; 8 using System.Collections.Generic; 9 using System.Linq; 10 using System.Text; 11 using System.Threading.Tasks; 12 13 namespace IoCDemo.Sort 14 { 15 class Program 16 { 17 static void Main(string[] args) 18 { 19 20 object [,] array = { { 60, 5 }, { 15, 5 }, { 30, 5 }, { 1, 5 }, { 2, 5 } }; 21 Console.WriteLine("没排序前的二维数组:"); 22 Print(array); 23 Console.WriteLine("根据第1,2列升序排序后的数组:"); 24 Order.Orderby(array, new int[] { 0, 1 }, 0); 25 Print(array); 26 27 Console.WriteLine("根据第1,2列降序序排序后的数组:"); 28 Order.Orderby(array, new int[] { 1, 0 }, 1); 29 Print(array); 30 Console.ReadLine(); 31 } 32 static void Print(object[,] values) 33 { 34 int k; 35 for (int i = 0; i < values.GetLength(0); i++) 36 { 37 for (k = 0; k < values.GetLength(1); k++) 38 { 39 Console.Write(values[i, k]); 40 Console.Write(" "); 41 } 42 Console.WriteLine(" "); 43 } 44 } 45 class Order 46 { 47 /// <summary> 48 /// 对二维数组排序 49 /// </summary> 50 /// <param name="values">排序的二维数组</param> 51 /// <param name="orderColumnsIndexs">排序根据的列的索引号数组</param> 52 /// <param name="type">排序的类型,1代表降序,0代表升序</param> 53 /// <returns>返回排序后的二维数组</returns> 54 public static object[,] Orderby(object[,] values, int[] orderColumnsIndexs, int type) 55 { 56 object[] temp = new object[values.GetLength(1)]; 57 int k; 58 int compareResult; 59 for (int i = 0; i < values.GetLength(0); i++) 60 { 61 for (k = i + 1; k < values.GetLength(0); k++) 62 { 63 if (type.Equals(1)) 64 { 65 for (int h = 0; h < orderColumnsIndexs.Length; h++) 66 { 67 compareResult = Comparer.Default.Compare(GetRowByID(values, k).GetValue(orderColumnsIndexs[h]), GetRowByID(values, i).GetValue(orderColumnsIndexs[h])); 68 if (compareResult.Equals(1)) 69 { 70 temp = GetRowByID(values, i); 71 Array.Copy(values, k * values.GetLength(1), values, i * values.GetLength(1), values.GetLength(1)); 72 CopyToRow(values, k, temp); 73 } 74 if (compareResult != 0) 75 break; 76 } 77 } 78 else 79 { 80 for (int h = 0; h < orderColumnsIndexs.Length; h++) 81 { 82 compareResult = Comparer.Default.Compare(GetRowByID(values, k).GetValue(orderColumnsIndexs[h]), GetRowByID(values, i).GetValue(orderColumnsIndexs[h])); 83 if (compareResult.Equals(-1)) 84 { 85 temp = GetRowByID(values, i); 86 Array.Copy(values, k * values.GetLength(1), values, i * values.GetLength(1), values.GetLength(1)); 87 CopyToRow(values, k, temp); 88 } 89 if (compareResult != 0) 90 break; 91 } 92 } 93 } 94 } 95 return values; 96 97 } 98 /// <summary> 99 /// 获取二维数组中一行的数据 100 /// </summary> 101 /// <param name="values">二维数据</param> 102 /// <param name="rowID">行ID</param> 103 /// <returns>返回一行的数据</returns> 104 static object[] GetRowByID(object[,] values, int rowID) 105 { 106 if (rowID > (values.GetLength(0) - 1)) 107 throw new Exception("rowID超出最大的行索引号!"); 108 109 object[] row = new object[values.GetLength(1)]; 110 for (int i = 0; i < values.GetLength(1); i++) 111 { 112 row[i] = values[rowID, i]; 113 114 } 115 return row; 116 117 } 118 /// <summary> 119 /// 复制一行数据到二维数组指定的行上 120 /// </summary> 121 /// <param name="values"></param> 122 /// <param name="rowID"></param> 123 /// <param name="row"></param> 124 static void CopyToRow(object[,] values, int rowID, object[] row) 125 { 126 if (rowID > (values.GetLength(0) - 1)) 127 throw new Exception("rowID超出最大的行索引号!"); 128 if (row.Length > (values.GetLength(1))) 129 throw new Exception("row行数据列数超过二维数组的列数!"); 130 for (int i = 0; i < row.Length; i++) 131 { 132 values[rowID, i] = row[i]; 133 } 134 } 135 } 136 } 137 }
以上是关于二维数组按某列排序的主要内容,如果未能解决你的问题,请参考以下文章