none
ADO.NET->DataTable的Double列数据要从不同的单位间切换(如面积数据在平方米、公顷、亩之间切换),什么才是性能最佳的办法呢? RRS feed

  • 问题

  • 大安晚上好,再次来提问了,首先感谢你阅读的阅读本贴子并为我提出建议!

    我的问题的描述是这样的。我有这样的一个表,用代码构建描述如下:

    var dt = new DataTable("单位转换示例数据表(平方米)");
    
    var col1 = dt.Columns.Add("镇名称", typeof(String));
    
    col1.MaxLength = 100;
    
    col1.AllowDBNull = false;
    
    col1.DefaultValue = "未知镇";
    
    
    
    var col2 = dt.Columns.Add("村名称", typeof(String));
    
    col2.MaxLength = 100;
    
    col2.AllowDBNull = false;
    
    col2.DefaultValue = "未知村";
    
    
    
    var col3 = dt.Columns.Add("地块编号", typeof(String));
    
    col3.AllowDBNull = false;
    
    col2.DefaultValue = "001";
    
    
    
    var col4 = dt.Columns.Add("红线面积", typeof(Double));
    
    col4.AllowDBNull = false;
    
    col4.DefaultValue = 0;
    
    col4.Caption = "红线面积(平方米)";
    
    
    
    
    
    var col5 = dt.Columns.Add("蓝红面积", typeof(Double));
    
    col5.AllowDBNull = false;
    
    col5.DefaultValue = 0;
    
    col5.Caption = "蓝线面积(平方米)";
    
    

    下一步,我的程序向这样的一个DataTable填充了若干条数据。并显示到一个WindForm中的DataGridView中。

    我们知道,面积字段(即后面的红线面积、蓝线面积字段)用时候用户是需要在不同的单位之间切换的。如切换到公顷,亩等。

    为了解决这个问题,我现在的方法是:

    setp 1、构造一个相同结构的新表,(toDt)

    setp 2、求得当前单位与用户需要查看的面积单位之间的转换比例(rate)

    setp 3、新数据填充到新表中,面积单位字段乘以相应的比例。

    具体的代码是:

    // toDt:新表
    
    // dt:旧表
    
    // rate,新表与旧表之间的面积字段转换比例。
    
    dt.AsEnumerable().Aggregate(toDt, (vtodt, r) =>
    
    {
    
     vtodt.Rows.Add(
    
     r.Field<String>(0), r.Field<String>(1), r.Field<String>(2),
    
     r.Field<Double>(3) * rate, r.Field<Double>(4) * rate
    
     ); return vtodt;
    
    });
    
    

    我知道以上方法可以实现我想要的效果,但是在每一次单位转换之间,都需要创建新的表格并填充数据,似乎存在的程序性能上的问题

    所以,我的问题是:有没有一种更好的方法实现我想要的效果呢?、

    多谢大家!


    陈景标
    2011年4月17日 14:57

答案

全部回复

  • 你好!

    建议增加“单位”字段, DataColumn 支持表达式支持自动计算如

     DataColumn taxColumn = new DataColumn();

     taxColumn.DataType = System.Type.GetType("System.Decimal");

     taxColumn.ColumnName = "统计面积";

     taxColumn.Expression = "蓝红面积*单位";

    DataColumn.Expression 属性

    http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.expression(v=vs.80).aspx#Y6000


    知识改变命运,奋斗成就人生!
    • 已标记为答案 陈景标 2011年4月19日 16:20
    2011年4月18日 0:31
    版主
  • 首先多谢肖大版主的回答,你的回答是一语惊醒梦中人呀,按昭我的理解,我的问题可以这样解决。

    1、创建一个字段,我称之为“源面积”吧

    2、创建一个字段,名称为“单位”

    3,创建一个字段我称之为“统计面积”,并设置其Expression= [源面积]*[单位]

    之后,显示给用户看的其实是“统计面积”这个字段,根据用户不同的单位要求,在程序中设置“单位”字段的值,则“统计面积”字段的值也会相应变化。

    我写了以下程序进行了尝试:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Data;
    using System.Data.Linq;
    using System.Text;
    
    namespace GiftGis
    {
      class DataColumn_Expression属性中途改变练习Class
      {
        /// <summary>
        /// 创建表一个示例表格并向其中填充一些数据
        /// 这个表格的特点是第4列=第2列 * 第3列
        /// 通过设置第4列的Expression属性实现这个目的。
        /// 在Main Method中改变三列的值,观察第4 列的值是否有变化。
        /// </summary>
        /// <returns></returns>
        private static DataTable CreateMyTable()
        {
          var dt = new DataTable("Expression练习示例数据表");
          var col1 = dt.Columns.Add("镇名", typeof(String));
          col1.MaxLength = 100;
          col1.AllowDBNull = false;
    
          var col2 = dt.Columns.Add("原面积", typeof(Double));
          col2.AllowDBNull = false;
          col2.DefaultValue = 1;
    
          var col3 = dt.Columns.Add("转换单位", typeof(Double));
          col3.AllowDBNull = false;
          col3.DefaultValue = 1;
    
          var col4 = dt.Columns.Add("显示面积", typeof(Double));
          col4.AllowDBNull = false;
          col4.Expression = "[原面积]*[转换单位]"; // 请关注这里的Expression属性
    
          dt.Rows.Add("东坑", 23453.23, 0.45);
          dt.Rows.Add("南田", 34527.45, 0.45);
          return dt;
        }
    
        static void Main(string[] args)
        {
          var dt = CreateMyTable();
          String format = "{0} {1} {2} {3}";
          Console.ForegroundColor = ConsoleColor.Cyan;
          foreach (DataRow row in dt.Rows)
          {
            Console.WriteLine(String.Format(format, 
              row.Field<String>(0), 
              row.Field<Double>(1),
              row.Field<Double>(2), 
              row.Field<Double>(3)));
          }
    
          // 下面将第3列的值设置成 0.87(以前是0.45)看看第4列的值是否发生了变化。
          Console.ForegroundColor = ConsoleColor.Yellow;
          Console.WriteLine("\n现在设置转换单位字段的值是:0.78\n再次打印表的数值....\n");
          foreach (DataRow row in dt.Rows) row.SetField<Double>(2,0.78) ;
    
          Console.ForegroundColor = ConsoleColor.Green;
          foreach (DataRow row in dt.Rows)
          {
            Console.WriteLine(String.Format(format,
              row.Field<String>(0),
              row.Field<Double>(1),
              row.Field<Double>(2),
              row.Field<Double>(3)));
          }
          Console.ResetColor();
        }
    
        
      }
    }
    
    

    陈景标
    2011年4月19日 16:19