using System.Collections.Generic; using System.Data; using System.Linq; using System.Text.RegularExpressions; using DataTable = System.Data.DataTable; namespace Kreta.BusinessLogic.Utils { /// /// Extensions for manipulating DataTables /// public static class DataTableExtensions { private static string suffixPattern = @"(_DNAME)|(_BNAME)|(_BOOL)"; /// /// Replaces id columns with added _DNAME and _BNAME colums. /// /// DataTable returned by DataAccessBase.GetData. public static DataTable ConsolidateColumns(this DataTable table) { //Reading all column names var columnNames = (table.Columns.Cast().Select(column => column.ColumnName)).ToList(); //Selecting the columns we need in the right order var orderedColumnNames = new List(); foreach (var name in columnNames) { if (Regex.IsMatch(name, suffixPattern)) { continue; } if (columnNames.Contains($"{name}_DNAME")) { orderedColumnNames.Add($"{name}_DNAME"); } else if (columnNames.Contains($"{name}_BNAME")) { orderedColumnNames.Add($"{name}_BNAME"); } else { orderedColumnNames.Add(name); } } //Removing everything else var redundantColumnNames = columnNames.Except(orderedColumnNames); foreach (var name in redundantColumnNames) { table.Columns.Remove(name); } //Ordering columns var i = 0; foreach (var name in orderedColumnNames) { table.Columns[name].SetOrdinal(i++); } //Renaming columns var suffixedColumnNames = orderedColumnNames.Where(n => Regex.IsMatch(n, suffixPattern)); foreach (var name in suffixedColumnNames) { table.Columns[name].ColumnName = Regex.Replace(name, suffixPattern, string.Empty); } return table; } } }