using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Ropin.Core.Common { public static class EnumerableHelper { public static DataTable ToPivotTable(this IEnumerable source, Func columnSelector, Expression> rowSelector, Func, TData> dataSelector) { DataTable table = new DataTable(); var rowName = ((MemberExpression)rowSelector.Body).Member.Name; table.Columns.Add(new DataColumn(rowName)); var columns = source.Select(columnSelector).Distinct(); foreach (var column in columns) { table.Columns.Add(new DataColumn(column.ToString())); } var rows = source.GroupBy(rowSelector.Compile()) .Select(rowGroup => new { Key = rowGroup.Key, Values = columns.GroupJoin( rowGroup, c => c, r => columnSelector(r), (c, columnGroup) => dataSelector(columnGroup)) }); foreach (var row in rows) { var dataRow = table.NewRow(); var items = row.Values.Cast().ToList(); items.Insert(0, row.Key); //List list = new List(); //foreach (var vals in items) //{ // var va = GetValues(vals.ToString()); // list.Add(va); //} dataRow.ItemArray = items.ToArray(); table.Rows.Add(dataRow); } return table; } public static string GetValues(string value) { //bool isInteger = Regex.IsMatch(value, @"^\d+$"); bool isDecimal = Regex.IsMatch(value, @"^\d+(\.\d+)?$"); bool bol = true; if (isDecimal) { var spl= value.Split('.'); if (spl.Count()>=2&&value.Split('.')?[1].Length > 3) { bol = false; } } if (bol) { return value; } else { return Convert.ToDecimal(value).ToString("F3"); } } } }