Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.81 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using hsb.Classes;
  8. using hsb.Types;
  9.  
  10. namespace hsb.Extensions
  11. {
  12. #region 【Static Class : ArrayEx】
  13. /// <summary>
  14. /// 配列の拡張メソッド
  15. /// </summary>
  16. public static class ArrayEx
  17. {
  18. #region 【Class : SquareArrayColumn】
  19. /// <summary>
  20. /// 2次元配列向け列クラス
  21. /// </summary>
  22. /// <typeparam name="T"></typeparam>
  23. public class SquareArrayColumn<T> : IEnumerable<T>
  24. {
  25. #region ■ Members
  26. /// <summary>
  27. /// 2次元配列
  28. /// </summary>
  29. private T[,] _array;
  30. /// <summary>
  31. /// 列インデックス
  32. /// </summary>
  33. private int _colIndex;
  34. #endregion
  35.  
  36. #region ■ Properties
  37.  
  38. #region - Indexa : インデクサ
  39. /// <summary>
  40. /// インデクサ
  41. /// </summary>
  42. /// <param name="rowIndex">行インデックス</param>
  43. /// <returns>要素</returns>
  44. public T this[int rowIndex]
  45. {
  46. get => _array[rowIndex, _colIndex];
  47. set => _array[rowIndex, _colIndex] = value;
  48. }
  49. #endregion
  50.  
  51. #region - Length : 長さ
  52. /// <summary>
  53. /// Length
  54. /// </summary>
  55. public int Length => _array.GetLength(0);
  56. #endregion
  57.  
  58. #endregion
  59.  
  60. #region ■ Constructor
  61. /// <summary>
  62. /// Constructor
  63. /// </summary>
  64. /// <param name="array">2次元配列</param>
  65. /// <param name="rowIndex">行インデックス</param>
  66. public SquareArrayColumn(T[,] array, int colIndex)
  67. {
  68. _array = array;
  69. _colIndex = colIndex;
  70. }
  71. #endregion
  72.  
  73. #region ■ Methods
  74.  
  75. #region - GetEnumerator : GetEnumerator()の実装
  76. /// <summary>
  77. /// GetEnumerator()の実装
  78. /// </summary>
  79. /// <returns>IEnumerator<T></returns>
  80. public IEnumerator<T> GetEnumerator()
  81. {
  82. for (var i = 0; i < Length; i++)
  83. yield return this[i];
  84. }
  85. #endregion
  86.  
  87. #region - GetEnumerator : GetEnumerator()の実装
  88. /// <summary>
  89. /// GetEnumerator()の実装
  90. /// </summary>
  91. /// <returns>IEnumerator</returns>
  92. IEnumerator IEnumerable.GetEnumerator()
  93. {
  94. return this.GetEnumerator();
  95. }
  96. #endregion
  97.  
  98. #endregion
  99. }
  100. #endregion
  101.  
  102. #region 【Class : SquareArrayRow】
  103. /// <summary>
  104. /// 2次元配列向け行クラス
  105. /// </summary>
  106. /// <typeparam name="T">型パラメータ</typeparam>
  107. public class SquareArrayRow<T> : IEnumerable<T>
  108. {
  109. #region ■ Members
  110. /// <summary>
  111. /// 2次元配列
  112. /// </summary>
  113. private T[,] _array;
  114. /// <summary>
  115. /// 行インデックス
  116. /// </summary>
  117. private int _rowIndex;
  118. #endregion
  119.  
  120. #region ■ Properties
  121.  
  122. #region - Indexa : インデクサ
  123. /// <summary>
  124. /// インデクサ
  125. /// </summary>
  126. /// <param name="colIndex">列インデックス</param>
  127. /// <returns>要素</returns>
  128. public T this[int colIndex]
  129. {
  130. get => _array[_rowIndex, colIndex];
  131. set => _array[_rowIndex, colIndex] = value;
  132. }
  133. #endregion
  134.  
  135. #region - Length : 長さ
  136. /// <summary>
  137. /// Length
  138. /// </summary>
  139. public int Length => _array.GetLength(1);
  140. #endregion
  141.  
  142. #endregion
  143.  
  144. #region ■ Constructor
  145. /// <summary>
  146. /// Constructor
  147. /// </summary>
  148. /// <param name="array">2次元配列</param>
  149. /// <param name="rowIndex">行インデックス</param>
  150. public SquareArrayRow(T[,] array, int rowIndex)
  151. {
  152. _array = array;
  153. _rowIndex = rowIndex;
  154. }
  155. #endregion
  156.  
  157. #region ■ Methods
  158.  
  159. #region - GetEnumerator : GetEnumerator()の実装
  160. /// <summary>
  161. /// GetEnumerator()の実装
  162. /// </summary>
  163. /// <returns>IEnumerator<T></returns>
  164. public IEnumerator<T> GetEnumerator()
  165. {
  166. for (var i = 0; i < Length; i++)
  167. yield return this[i];
  168. }
  169. #endregion
  170.  
  171. #region - GetEnumerator : GetEnumerator()の実装
  172. /// <summary>
  173. /// GetEnumerator()の実装
  174. /// </summary>
  175. /// <returns>IEnumerator</returns>
  176. IEnumerator IEnumerable.GetEnumerator()
  177. {
  178. return this.GetEnumerator();
  179. }
  180. #endregion
  181.  
  182. #endregion
  183. }
  184. #endregion
  185.  
  186. #region ■ Extension Methods
  187.  
  188. #region - Rows : 2次元配列から行を取得する
  189. /// <summary>
  190. /// 2次元配列から行を取得する
  191. /// </summary>
  192. /// <typeparam name="T">型パラメータ</typeparam>
  193. /// <param name="array">this 2次元配列</param>
  194. /// <param name="rowIndex">行インデックス</param>
  195. /// <returns>行オブジェクト</returns>
  196. public static SquareArrayRow<T> Rows<T>(this T[,] array, int rowIndex)
  197. {
  198. if (rowIndex < 0 || array.GetLength(0) <= rowIndex)
  199. throw new IndexOutOfRangeException();
  200. return new SquareArrayRow<T>(array, rowIndex);
  201. }
  202. #endregion
  203.  
  204. #region - Rows : 2次元配列から行を列挙する
  205. /// <summary>
  206. /// 2次元配列から行を列挙する
  207. /// </summary>
  208. /// <typeparam name="T">型パラメータ</typeparam>
  209. /// <param name="array">this 2次元配列</param>
  210. /// <returns>行オブジェクトの列挙子</returns>
  211. public static IEnumerable<SquareArrayRow<T>> Rows<T>(this T[,] array)
  212. {
  213. for (var row = 0; row < array.GetLength(0); row++)
  214. yield return array.Rows(row);
  215. }
  216. #endregion
  217.  
  218. #region - Cols : 2次元配列から列を取得する
  219. /// <summary>
  220. /// 2次元配列から列を取得する
  221. /// </summary>
  222. /// <typeparam name="T">型パラメータ</typeparam>
  223. /// <param name="array">this 2次元配列</param>
  224. /// <param name="colIndex">列インデックス</param>
  225. /// <returns>行オブジェクト</returns>
  226. public static SquareArrayColumn<T> Cols<T>(this T[,] array, int colIndex)
  227. {
  228. if (colIndex < 0 || array.GetLength(1) <= colIndex)
  229. throw new IndexOutOfRangeException();
  230. return new SquareArrayColumn<T>(array, colIndex);
  231. }
  232. #endregion
  233.  
  234. #region - Cols : 2次元配列から列を列挙する
  235. /// <summary>
  236. /// 2次元配列から列を列挙する
  237. /// </summary>
  238. /// <typeparam name="T">型パラメータ</typeparam>
  239. /// <param name="array">this 2次元配列</param>
  240. /// <returns>行オブジェクトの列挙子</returns>
  241. public static IEnumerable<SquareArrayColumn<T>> Cols<T>(this T[,] array)
  242. {
  243. for (var col = 0; col < array.GetLength(1); col++)
  244. yield return array.Cols(col);
  245. }
  246. #endregion
  247.  
  248. #region - Flatten : 2次元配列をまとめて列挙する
  249. /// <summary>
  250. /// 2次元配列をまとめて列挙する
  251. /// </summary>
  252. /// <typeparam name="T">型パラメータ</typeparam>
  253. /// <param name="array">2次元配列</param>
  254. /// <param name="direction">方向</param>
  255. /// <returns>列挙子</returns>
  256. public static IEnumerable<T> Flatten<T>(this T[,] array, SquareDirection direction = SquareDirection.Row)
  257. {
  258. IEnumerable<T> rowDirection()
  259. {
  260. for (var row = 0; row < array.GetLength(0); row++)
  261. {
  262. for (var col = 0; col < array.GetLength(1); col++)
  263. {
  264. yield return array[row, col];
  265. }
  266. }
  267. }
  268.  
  269. IEnumerable<T> colDirection()
  270. {
  271. for (var col = 0; col < array.GetLength(1); col++)
  272. {
  273. for (var row = 0; row < array.GetLength(0); row++)
  274. {
  275. yield return array[row, col];
  276. }
  277. }
  278. }
  279.  
  280. if (direction == SquareDirection.Row)
  281. return rowDirection();
  282. else
  283. return colDirection();
  284. }
  285. #endregion
  286.  
  287. #region - Rotate : 2次元配列を回転させた配列を返す
  288. /// <summary>
  289. /// 2次元配列を回転させた配列を返す
  290. /// </summary>
  291. /// <typeparam name="T">型パラメータ</typeparam>
  292. /// <param name="array">配列</param>
  293. /// <param name="direction">回転方向</param>
  294. /// <returns>配列</returns>
  295. public static T[,] Rotate<T>(this T[,] array, RotateDirection direction = RotateDirection.Right)
  296. {
  297. T[,] RightDirection()
  298. {
  299. var result = new T[array.GetLength(1), array.GetLength(0)];
  300. var r = 0;
  301. for (var row = array.GetLength(0) - 1; row >= 0; row--)
  302. {
  303. for (var col = 0; col < array.GetLength(1); col++)
  304. {
  305. result[col, r] = array[row, col];
  306. }
  307. r++;
  308. }
  309. return result;
  310. }
  311.  
  312. T[,] LeftDirection()
  313. {
  314. var result = new T[array.GetLength(1), array.GetLength(0)];
  315. var c = 0;
  316. for (var col = array.GetLength(1) - 1; col >= 0; col--)
  317. {
  318. for (var row = 0; row < array.GetLength(0); row++)
  319. {
  320. result[c, row] = array[row, col];
  321. }
  322. c++;
  323. }
  324. return result;
  325. }
  326.  
  327. if (direction == RotateDirection.Right)
  328. return RightDirection();
  329. else
  330. return LeftDirection();
  331. }
  332. #endregion
  333.  
  334. #endregion
  335. }
  336. #endregion
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement