EnumerableHelper.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using System.Numerics;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. namespace Ropin.Core.Common
  12. {
  13. public static class EnumerableHelper
  14. {
  15. public static DataTable ToPivotTable<T, TColumn, TRow, TData>(this IEnumerable<T> source, Func<T, TColumn> columnSelector, Expression<Func<T, TRow>> rowSelector, Func<IEnumerable<T>, TData> dataSelector)
  16. {
  17. DataTable table = new DataTable();
  18. var rowName = ((MemberExpression)rowSelector.Body).Member.Name;
  19. table.Columns.Add(new DataColumn(rowName));
  20. var columns = source.Select(columnSelector).Distinct();
  21. foreach (var column in columns)
  22. {
  23. table.Columns.Add(new DataColumn(column.ToString()));
  24. }
  25. var rows = source.GroupBy(rowSelector.Compile())
  26. .Select(rowGroup => new
  27. {
  28. Key = rowGroup.Key,
  29. Values = columns.GroupJoin(
  30. rowGroup,
  31. c => c,
  32. r => columnSelector(r),
  33. (c, columnGroup) => dataSelector(columnGroup))
  34. });
  35. foreach (var row in rows)
  36. {
  37. var dataRow = table.NewRow();
  38. var items = row.Values.Cast<object>().ToList();
  39. items.Insert(0, row.Key);
  40. //List<object> list = new List<object>();
  41. //foreach (var vals in items)
  42. //{
  43. // var va = GetValues(vals.ToString());
  44. // list.Add(va);
  45. //}
  46. dataRow.ItemArray = items.ToArray();
  47. table.Rows.Add(dataRow);
  48. }
  49. return table;
  50. }
  51. public static string GetValues(string value)
  52. {
  53. //bool isInteger = Regex.IsMatch(value, @"^\d+$");
  54. bool isDecimal = Regex.IsMatch(value, @"^\d+(\.\d+)?$");
  55. bool bol = true;
  56. if (isDecimal)
  57. {
  58. var spl= value.Split('.');
  59. if (spl.Count()>=2&&value.Split('.')?[1].Length > 3)
  60. {
  61. bol = false;
  62. }
  63. }
  64. if (bol) { return value; }
  65. else { return Convert.ToDecimal(value).ToString("F3"); }
  66. }
  67. }
  68. }