CSharp 案例:用 Dynamic 来解决 DataTable 数值累加问题
需求说明
给定一个 DataTable,如果从中取出数值类型列的值并对其累加?
限制:不知该列是何种数值类型。
解决方案
1、将表转换为 IEnumerable<dynamic>,而后获取指定的列的值并对其累加;
2、如果该值类型为 DBNull,则视作 0;
3、使用 double,确保最小程度丢失精度。
关键方法 AsDynamicEnumerable
该方法出自 http://codego.net/368045/ ,关键方法为:
public static class DynamicTable
{
public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
{
//table.CheckNull("table");
return table.AsEnumerable().Select(row => new DynamicRow(row));
}
private sealed class DynamicRow : DynamicObject
{
private readonly DataRow _row;
internal DynamicRow(DataRow row) { _row = row; }
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var retVal = _row.Table.Columns.Contains(binder.Name);
result = retVal ? _row[binder.Name] : null;
return retVal;
}
}
}
使用与单元测试

缘何选择 Double?
从 int、uint、long 或 ulong 转换为 float,从 long 或 ulong 转换为 double 会丢失精度(loss of precision),但不会导致数量级的丢失(loss of magnitude)。其它的隐式数制转换不会丢失任何信息。
——《C# Language Specification 5.0 (翻译)第六章 转换》,「隐式数值转换」,本文作者译
需要改进之处
事实上这个方法并非健全之策。如果你对数值的精度要求比较高,或者你选择使用 Decimal 类型,则其可能丢失的精度会让你不可容忍。另外,还需要判断该列对象是否为数值类型的值,如果不是的话该如何处理。最后,同时也最关键的是,如果不用DataTable,那么就没有这些烦恼了。
CSharp 案例:用 Dynamic 来解决 DataTable 数值累加问题的更多相关文章
- 使用dynamic linq 解决自定义查询的若干弊端
在项目中想必大家肯定是使用各种ORM, 如:NH.EF.fluent Data. 然而我在使用ORM的这几年中,随着数据库的结构越来越复杂,自定义查询的越来越多,但是一直没有解决一个问题就是自定义查询 ...
- 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题
2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...
- [2017-08-25]100行CSharp代码利用dynamic写个DSL(特定领域语言)
最近看<CLR via C#(第4版)> 读到第五章末尾dynamic基元类型时,看了下作者的一个利用dynamic动态调用string类型的Contains方法(静态方法)的实现,突然发 ...
- SpriteBuilder 不能对设置spriteframe的sprite进行设置dynamic Physics解决办法
可能spriteBuilder是最新推出 cocos2d 可视化,在学习过程中遇到一些Bug,比如你对一个精灵设置了一个动画帧(spriteframe),这并不会改变他的物理属性,正常来说是可以设置他 ...
- 使用Linq 来解决Datatable 去除数据重复
在这也说明下,除此之外还可以通过 DataView 的方式来处理,当个人觉得这有点不好用.这里就不多作说明了 代码比较简单,直接看代码 using System; using System.Colle ...
- 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法
问题起因: 扔给数据库一条select * from [表名] , 得到一个DataTable, 发现有一列status状态的DataColumn的类型是int,然后我想换成字典表里的文字描述,然后就 ...
- 进阶:案例五: Dynamic 创建 Business Graphic
效果图: step: 无需节点无需UI 1.添加属性 2.代码: method WDDOMODIFYVIEW . DATA:lr_graph TYPE REF TO cl_wd_business_gr ...
- QTP 自动化测试--点滴 获取datatable数值/dafault文件位置
0 设置default.xls文件位置 右键项目-settings-resources-datatable-选择 数据表的位置如图 心得:同一个项目-分成多个测试项目-这些测试项目可以共用同一张数据表 ...
- C# 解决datatable写入文件内存溢出问题
1.程序生成目标平台设为x64 2.文件写入后主动回收内存
随机推荐
- Sublime Text 3 注册码激活码被移除的解决办法
新版的sublime text3中加入了验证功能,之前成功注册的也被移除了,在网上搜索的验证码要么已经失效要么已经被封,少数几个正常的注册输入进去注册成功后几分钟之内这个注册码就会被莫名其妙的被移除. ...
- Windows:Oracle 11g 备份脚本
@echo off echo ================================================ echo Windows环境下Oracle数据库的自动备份脚本 echo ...
- Alpha冲刺! Day4 - 磨刀
Alpha冲刺! Day4 - 磨刀 今日已完成 晨瑶:和大家交流了一下,反思这阶段团队遇到的问题. 昭锡:今天跟学长交流了点问题,学习了Gson使用. 永盛:Gravel 数据库重新设计. 立强:看 ...
- JAVA中实现单例(Singleton)模式的八种方式
单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 基本的实现思路 单 ...
- WINDOWS 下设置单独的java环境
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_65set PATH=%JAVA_HOME%\bin;%PATH%;D:cd D:\JavaProjectcm ...
- 离线安装PostgreSQL
postgresql在线安装很简单,但是很多情况,服务器不能联网,需要离线安装.下面是离线安装的步骤: 1. 首先进入官网: https://www.postgresql.org/ 2. 点击Down ...
- Django admin 后台管理
在App 文件夹下的 admin.py 文件中写入 from django.contrib import admin from app名 import models admin.site.site_h ...
- C#中删除集合中符合条件的元素以及需注意属相
如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...
- django知识点回顾(上)
Django---知识点: 1. 配置文件: media: avatar = models.FileField(upload_to='avatar')#数据库里的model MEDIA_ROOT=os ...
- Python字符串操作之字符串分割与组合
12.字符串的分割和组合 12.1 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s ...