1. 程式人生 > >二維數組按某列排序

二維數組按某列排序

column linq copy blog ons readline cab row system

技術分享
  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 }
View Code

技術分享

二維數組按某列排序