using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MatrixExtensions { public class MatrixL { List> src; T init; int r; int c; public int R { get { if (r > 0) return r; else return -1; } } public int C { get { if (c > 0) return c; else return -1; } } public T this[int i, int j] { get { if (r > 0 && c > 0) if (i > -1 && j > -1) return src[i] [j]; else throw new ArgumentException("Неверный задана индексация"); else throw new ArgumentException("Не задана матрица"); } set { if (r > 0 && c > 0) if (i > -1 && j > -1) src[i][j] = value; else throw new ArgumentException("Неверный задана индексация"); else throw new ArgumentException("Не задана матрица"); } } public MatrixL(int r, int c, T initValue) { this.r = r; this.c = c; init = initValue; src = new List>(r); for (int i = 0; i < r; i++) { src.Add(new List(c)); for (int j = 0; j < c; j++) { src[i].Add(initValue); } } } /// ///Извлечение строки по указанному индексу. /// /// Индекс строки для извлечения. /// public List Row (int idxR) { if (r == 0 || idxR < 0 || idxR > r) throw new ArgumentException("Матрица пустая либо не верно указан индекс строки."); return src[idxR]; } /// /// Извлечение столбца по указанному индексу. /// /// Индекс столбца для извлечения. /// public List Col (int idxC) { if (c == 0 || idxC < 0 || idxC > c) throw new ArgumentException("Матрица пустая либо не верно указан индекс столбца."); List res = new List(r); foreach (List item in src) res.Add(item[idxC]); return res; } /// /// Вставка строки со значениями по умолчанию по указанному индексу. /// /// Индекс строки для вставки. public void InsertRow(int idxR) { if (r == 0 || idxR < 0 || idxR > r) throw new ArgumentException("Матрица пустая либо не верно указан индекс строки для вставки."); src.Insert(idxR, new List(c)); r++; for (int i = 0; i < c; i++) src[idxR].Add(init); } /// /// Вставка строки по указанному индексу. /// /// Индекс строки для вставки. /// Список значений элементов строки public void InsertRow(int idxR, List row) { if (r == 0 || idxR < 0 || idxR > r) throw new ArgumentException("Матрица пустая либо не верно указан индекс строки для вставки."); src.Insert(idxR, new List(c)); r++; int n = c; if (row.Count < c) n = row.Count; for (int i = 0; i < n; i++) src[idxR].Add(row[i]); if (row.Count < c) { for (int i = n; i < c; i++) src[idxR].Add(init); } } /// /// Вставка столбца со значениями по умолчанию по указанному индексу. /// /// Индекс столбца для вставки. public void InsertCol(int idxC) { if (c == 0 || idxC < 0 || idxC > c) throw new ArgumentException("Матрица пустая либо не верно указан индекс столбца для вставки."); c++; for (int i = 0; i < r; i++) src[i].Insert(idxC, init); } /// /// Вставка столбца по указанному индексу. /// /// Индекс столбца для вставки. /// Список значений элементов столбца public void InsertCol(int idxC, List col) { if (c == 0 || idxC < 0 || idxC > c) throw new ArgumentException("Матрица пустая либо не верно указан индекс столбца для вставки."); c++; for (int i = 0; i < r; i++) src[i].Insert(idxC, init); int n = r; if (col.Count < r) n = col.Count; for (int i = 0; i < n; i++) { for (int j = 0; j < r; j++) { //src[j].Insert(idxC, col[i]); if (j >= n) continue; src[j][idxC] = col[i]; } } } public void RemoveRowAt(int idxR) { if (r > 0 && idxR >= 0 && idxR <= r) { src.RemoveAt(idxR); r--; } else throw new ArgumentException("Матрица пустая либо не верно указан индекс строки для удаления."); } public void RemoveColAt(int idxC) { if (c > 0 && idxC >= 0 && idxC<=c) { foreach (List item in src) { item.RemoveAt(idxC); } c--; } else throw new ArgumentException("Матрица пустая либо не верно указан индекс столбца для удаления."); } public List ToList() { List res = new List(r * c); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { res.Add(src[i][j]); } } return res; } } }