SHARE
TWEET

Untitled

a guest Mar 21st, 2019 56 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top