Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using hsb.Classes;
- using hsb.Types;
- namespace hsb.Extensions
- {
- #region 【Static Class : ArrayEx】
- /// <summary>
- /// 配列の拡張メソッド
- /// </summary>
- public static class ArrayEx
- {
- #region 【Class : SquareArrayColumn】
- /// <summary>
- /// 2次元配列向け列クラス
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class SquareArrayColumn<T> : IEnumerable<T>
- {
- #region ■ Members
- /// <summary>
- /// 2次元配列
- /// </summary>
- private T[,] _array;
- /// <summary>
- /// 列インデックス
- /// </summary>
- private int _colIndex;
- #endregion
- #region ■ Properties
- #region - Indexa : インデクサ
- /// <summary>
- /// インデクサ
- /// </summary>
- /// <param name="rowIndex">行インデックス</param>
- /// <returns>要素</returns>
- public T this[int rowIndex]
- {
- get => _array[rowIndex, _colIndex];
- set => _array[rowIndex, _colIndex] = value;
- }
- #endregion
- #region - Length : 長さ
- /// <summary>
- /// Length
- /// </summary>
- public int Length => _array.GetLength(0);
- #endregion
- #endregion
- #region ■ Constructor
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="array">2次元配列</param>
- /// <param name="rowIndex">行インデックス</param>
- public SquareArrayColumn(T[,] array, int colIndex)
- {
- _array = array;
- _colIndex = colIndex;
- }
- #endregion
- #region ■ Methods
- #region - GetEnumerator : GetEnumerator()の実装
- /// <summary>
- /// GetEnumerator()の実装
- /// </summary>
- /// <returns>IEnumerator<T></returns>
- public IEnumerator<T> GetEnumerator()
- {
- for (var i = 0; i < Length; i++)
- yield return this[i];
- }
- #endregion
- #region - GetEnumerator : GetEnumerator()の実装
- /// <summary>
- /// GetEnumerator()の実装
- /// </summary>
- /// <returns>IEnumerator</returns>
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- #endregion
- #endregion
- }
- #endregion
- #region 【Class : SquareArrayRow】
- /// <summary>
- /// 2次元配列向け行クラス
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- public class SquareArrayRow<T> : IEnumerable<T>
- {
- #region ■ Members
- /// <summary>
- /// 2次元配列
- /// </summary>
- private T[,] _array;
- /// <summary>
- /// 行インデックス
- /// </summary>
- private int _rowIndex;
- #endregion
- #region ■ Properties
- #region - Indexa : インデクサ
- /// <summary>
- /// インデクサ
- /// </summary>
- /// <param name="colIndex">列インデックス</param>
- /// <returns>要素</returns>
- public T this[int colIndex]
- {
- get => _array[_rowIndex, colIndex];
- set => _array[_rowIndex, colIndex] = value;
- }
- #endregion
- #region - Length : 長さ
- /// <summary>
- /// Length
- /// </summary>
- public int Length => _array.GetLength(1);
- #endregion
- #endregion
- #region ■ Constructor
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name="array">2次元配列</param>
- /// <param name="rowIndex">行インデックス</param>
- public SquareArrayRow(T[,] array, int rowIndex)
- {
- _array = array;
- _rowIndex = rowIndex;
- }
- #endregion
- #region ■ Methods
- #region - GetEnumerator : GetEnumerator()の実装
- /// <summary>
- /// GetEnumerator()の実装
- /// </summary>
- /// <returns>IEnumerator<T></returns>
- public IEnumerator<T> GetEnumerator()
- {
- for (var i = 0; i < Length; i++)
- yield return this[i];
- }
- #endregion
- #region - GetEnumerator : GetEnumerator()の実装
- /// <summary>
- /// GetEnumerator()の実装
- /// </summary>
- /// <returns>IEnumerator</returns>
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- #endregion
- #endregion
- }
- #endregion
- #region ■ Extension Methods
- #region - Rows : 2次元配列から行を取得する
- /// <summary>
- /// 2次元配列から行を取得する
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">this 2次元配列</param>
- /// <param name="rowIndex">行インデックス</param>
- /// <returns>行オブジェクト</returns>
- public static SquareArrayRow<T> Rows<T>(this T[,] array, int rowIndex)
- {
- if (rowIndex < 0 || array.GetLength(0) <= rowIndex)
- throw new IndexOutOfRangeException();
- return new SquareArrayRow<T>(array, rowIndex);
- }
- #endregion
- #region - Rows : 2次元配列から行を列挙する
- /// <summary>
- /// 2次元配列から行を列挙する
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">this 2次元配列</param>
- /// <returns>行オブジェクトの列挙子</returns>
- public static IEnumerable<SquareArrayRow<T>> Rows<T>(this T[,] array)
- {
- for (var row = 0; row < array.GetLength(0); row++)
- yield return array.Rows(row);
- }
- #endregion
- #region - Cols : 2次元配列から列を取得する
- /// <summary>
- /// 2次元配列から列を取得する
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">this 2次元配列</param>
- /// <param name="colIndex">列インデックス</param>
- /// <returns>行オブジェクト</returns>
- public static SquareArrayColumn<T> Cols<T>(this T[,] array, int colIndex)
- {
- if (colIndex < 0 || array.GetLength(1) <= colIndex)
- throw new IndexOutOfRangeException();
- return new SquareArrayColumn<T>(array, colIndex);
- }
- #endregion
- #region - Cols : 2次元配列から列を列挙する
- /// <summary>
- /// 2次元配列から列を列挙する
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">this 2次元配列</param>
- /// <returns>行オブジェクトの列挙子</returns>
- public static IEnumerable<SquareArrayColumn<T>> Cols<T>(this T[,] array)
- {
- for (var col = 0; col < array.GetLength(1); col++)
- yield return array.Cols(col);
- }
- #endregion
- #region - Flatten : 2次元配列をまとめて列挙する
- /// <summary>
- /// 2次元配列をまとめて列挙する
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">2次元配列</param>
- /// <param name="direction">方向</param>
- /// <returns>列挙子</returns>
- public static IEnumerable<T> Flatten<T>(this T[,] array, SquareDirection direction = SquareDirection.Row)
- {
- IEnumerable<T> rowDirection()
- {
- for (var row = 0; row < array.GetLength(0); row++)
- {
- for (var col = 0; col < array.GetLength(1); col++)
- {
- yield return array[row, col];
- }
- }
- }
- IEnumerable<T> colDirection()
- {
- for (var col = 0; col < array.GetLength(1); col++)
- {
- for (var row = 0; row < array.GetLength(0); row++)
- {
- yield return array[row, col];
- }
- }
- }
- if (direction == SquareDirection.Row)
- return rowDirection();
- else
- return colDirection();
- }
- #endregion
- #region - Rotate : 2次元配列を回転させた配列を返す
- /// <summary>
- /// 2次元配列を回転させた配列を返す
- /// </summary>
- /// <typeparam name="T">型パラメータ</typeparam>
- /// <param name="array">配列</param>
- /// <param name="direction">回転方向</param>
- /// <returns>配列</returns>
- public static T[,] Rotate<T>(this T[,] array, RotateDirection direction = RotateDirection.Right)
- {
- T[,] RightDirection()
- {
- var result = new T[array.GetLength(1), array.GetLength(0)];
- var r = 0;
- for (var row = array.GetLength(0) - 1; row >= 0; row--)
- {
- for (var col = 0; col < array.GetLength(1); col++)
- {
- result[col, r] = array[row, col];
- }
- r++;
- }
- return result;
- }
- T[,] LeftDirection()
- {
- var result = new T[array.GetLength(1), array.GetLength(0)];
- var c = 0;
- for (var col = array.GetLength(1) - 1; col >= 0; col--)
- {
- for (var row = 0; row < array.GetLength(0); row++)
- {
- result[c, row] = array[row, col];
- }
- c++;
- }
- return result;
- }
- if (direction == RotateDirection.Right)
- return RightDirection();
- else
- return LeftDirection();
- }
- #endregion
- #endregion
- }
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement