Вот, работает для любого количества столбцов:
| Код | class Program { static void Main(string[] args) { var initialData = CreateInitialData();
Console.WriteLine("Initial:"); PrintDataTable(initialData);
Console.WriteLine(); Console.WriteLine("Result:"); PrintDataTable(CalculateStatistics(initialData, 3));
Console.ReadLine(); }
private static DataTable CreateInitialData() { var table = new DataTable(); table.Columns.Add(new DataColumn("F", typeof(string))); table.Columns.Add(new DataColumn("I", typeof(string))); table.Columns.Add(new DataColumn("O", typeof(string))); table.Columns.Add(new DataColumn("Year", typeof(int)));
table.Rows.Add("Иванов", "Сергей", "Иванович", 1980); table.Rows.Add("Иванов", "Олег", "Петрович", 1981); table.Rows.Add("Иванов", "Кирилл", "Семенович", 1980); table.Rows.Add("Петров", "Сергей", "Семенович", 1982); table.Rows.Add("Петров", "Кирилл", "Семенович", 1980); table.Rows.Add("Сидоров", "Сергей", "Иванович", 1983); table.Rows.Add("Сидоров", "Иван", "Петрович", 1980);
return table; }
private static DataTable CalculateStatistics(DataTable table, int mainColInd) { var res = new DataTable(); res.Columns.Add(new DataColumn("Main", typeof(string))); res.Columns.AddRange(Enumerable.Range(1, table.Columns.Count - 1) .Select(n => new DataColumn("fl" + n, typeof(int))) .ToArray());
var checkColumns = table.Columns.Cast<DataColumn>().Where((col, ind) => ind != mainColInd).ToArray(); var mainValues = table.AsEnumerable().Select(r => r[mainColInd]).Distinct();
foreach (var value in mainValues) { var row = res.NewRow();
int resColPos = 0; row[resColPos++] = value;
foreach (var col in checkColumns) { row[resColPos++] = table.AsEnumerable() .Where(r => r[mainColInd].Equals(value)) .Select(r => r[col]) .Distinct() .Count(); }
res.Rows.Add(row); }
return res; }
private static void PrintDataTable(DataTable table) { const int colWidth = 15;
Console.WriteLine(string.Join("", table.Columns.Cast<DataColumn>().Select(c => c.ColumnName.PadRight(colWidth))));
Console.WriteLine(new string('-', colWidth * table.Columns.Count));
foreach (var row in table.AsEnumerable()) { Console.WriteLine(string.Join("", row.ItemArray.Select(c => c.ToString().PadRight(colWidth)))); } } }
|
|