C # - Как математические операции в DataTable - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть DataTable, и я хочу выполнить некоторые математические операции, прежде чем добавлять их в DataGridView.Во-первых, я хочу найти максимальное число в третьем столбце моей таблицы данных, во-вторых, я хочу разделить все значения в третьем столбце с этим максимальным числом.В конце концов я хочу заменить мои новые значения вместо старых.Мой DataTable выглядит так:

        Column 1     Column 2     Column 3
     ---------------------------------------
          a             b          2000000
          q             r          250000
          s             t          185000
          m             w          400000
          o             p          750000

После операций мой DataTable должен выглядеть так;

        Column 1     Column 2     Column 3
     ---------------------------------------
          a             b          1
          q             r          0.125
          s             t          0.0925
          m             w          0.0002
          o             p          0.375

Это мой код;

      connection.Open();
      //Some insignificant operations here.
      for (int q = 0; q < w.Length; q++)
      {
          for (int a = q + 1; a < w.Length; a++)
          {
              string query = ".....";
              SqlDataAdapter myAdapter = new SqlDataAdapter(query, connection);
              DataTable myTable = new DataTable();
              myAdapter.Fill(myTable);
              //I started here for finding maximum number in DataTable.
              int[] myColumn = dt.AsEnumerable().Select(x => x.Field<int>("Column3")).ToArray();
              int myMaximum = myColumn.Max();
              //I don't know what should I do after that.
              foreach (DataRow myRows in myTable.Rows)
              {
                  //Some significant operations again...
                  dgv1.Rows.Add(...);
              }
          }
      }
      connection.Close();

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Рассматривали ли вы добавление 4-го столбца к существующей таблице?Сделать столбец выражением «Выражение», чтобы выполнить математику, как вы описываете, а затем скрыть третий столбец?

Пример этого приведен ниже…

DataTable GridTable;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  GridTable = GetDataTable();
  FillTable(GridTable);
  AddExpressionColumn(GridTable);
  dataGridView1.DataSource = GridTable;
  dataGridView1.Columns["Column3"].Visible = false;
}

private DataTable GetDataTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Column1", typeof(string));
  dt.Columns.Add("Column2", typeof(string));
  dt.Columns.Add("Column3", typeof(int));
  return dt;
}

private void FillTable(DataTable dt) {
  dt.Rows.Add("a", "b", 2000000);
  dt.Rows.Add("q", "r", 250000);
  dt.Rows.Add("s", "t", 185000);
  dt.Rows.Add("m", "w", 400000);
  dt.Rows.Add("o", "p", 750000);
}

private void AddExpressionColumn(DataTable dt) {
  DataColumn expCol = new DataColumn("Result", typeof(decimal));
  dt.Columns.Add(expCol);
  string expressionString = "Column3 / " + GetMaxValue(dt).ToString();
  expCol.Expression = expressionString;
}

private int GetMaxValue(DataTable dt) {
  int max = (int)dt.Compute("Max(Column3)", "");
  if (max == 0)
    return 1;
  return max;
}
0 голосов
/ 21 февраля 2019

Я бы посоветовал избавиться от DataTable и работать с простыми классами c #.
DataTable - это «тяжелая» структура, которая делает гораздо больше, чем нужно, и в большинстве случаев вам это не нужно.

Создание класса для представления ваших данных

public class Item
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public int Column3 { get; set; }
}

Загрузка данных

public List<Item> LoadData()
{
    var query = "SELECT Column1, Column2, Column3 FROM Table";
    using (var connection = new SqlConnection(connectionString))
    using (var command = connection.CreateCommand())
    {
        command.CommandType = CommandType.Text;
        command.CommandText = query;

        using (var reader = command.ExecuteReader())
        {
            var data = new List<Item>();
            while(reader.Read())
            {
                var item = new Item
                {
                    Column1 = reader.GetString(0),
                    Column1 = reader.GetString(1),
                    Column1 = reader.GetInt32(2)
                };
                data.Add(item);
            }

            return data;
        }
    }
}

Создание класса для представления вычисленных данных

public class CalculatedItem
{
    public string Column1 { get; }
    public string Column2 { get; }
    public decimal Calculated { get; }

    public CalculatedItem(Item item, decimal maxValue)
    {
        Column1 = item.Column1;
        Column2 = item.Column2;
        Calculated = (decimal)item.Column3 / maxValue
    }
} 

Использование

var data = LoadData();
var maxValue = data.Select(item => item.Column3).Max();
var calculatedData = data.Select(item => new CalculatedItem(item, maxValue)).ToList();

// Bind data to the DataGridView
DataGridView1.DataSource = calculatedDate;
0 голосов
/ 21 февраля 2019

Попробуйте:

var max = myTable.Rows.Cast<DataRow>().Max(r => r.Field<double>("Column 3"));

foreach (var row in myTable.Rows.Cast<DataRow>())
{
    row["Column 3"] = row.Field<double>("Column 3") / max;
}

Исполняемый тестовый код:

var myTable = new DataTable();
myTable.Columns.Add("Column 3", typeof(double));
myTable.Rows.Add(20_00_000);
myTable.Rows.Add(250_000);
myTable.Rows.Add(185_000);
myTable.Rows.Add(400_000);
myTable.Rows.Add(750_000);

Console.WriteLine(String.Join(", ", myTable.Rows.Cast<DataRow>().Select(r => r.Field<double>("Column 3"))));    

var max = myTable.Rows.Cast<DataRow>().Max(r => r.Field<double>("Column 3"));

foreach (var row in myTable.Rows.Cast<DataRow>())
{
    row["Column 3"] = row.Field<double>("Column 3") / max;
}

Console.WriteLine(String.Join(", ", myTable.Rows.Cast<DataRow>().Select(r => r.Field<double>("Column 3"))));

Это выводит:

2000000, 250000, 185000, 400000, 750000
1, 0.125, 0.0925, 0.2, 0.375

Обновление на основе"Столбец 3" - это int.

Console.WriteLine(String.Join(", ", myTable.Rows.Cast<DataRow>().Select(r => r.Field<int>("Column 3"))));

int max = myTable.Rows.Cast<DataRow>().Max(r => r.Field<int>("Column 3"));
double[] results = myTable.Rows.Cast<DataRow>().Select(r => (double)r.Field<int>("Column 3") / max).ToArray();

Console.WriteLine(String.Join(", ", results));

Теперь просто внесите в индекс results, когда вы создадите DataGridView.

...