飘飘悠悠 发表于 2015-1-16 14:20:29

来一篇关于NET的C#中DataTable行转列示例

中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。明天碰着一个需求,就是将上面表(1)格局的数据转换为表(2)格局的数据。很分明,这是一个行转列的请求,本想在数据库中行转列,由于在数据库中行转列是对照复杂的,办法能够参考本站SQLServer中(行列转换)行转列及列转行且加均匀值及汇总值,但因别的需求,终极需将该转化搬到C#中举行了。
客户称号日期金额A客户1月1000B客户2月1000C客户3月2000C客户4月2500
(表1)
客户称号1月2月3月4月算计A客户10000001000B客户01000001000C客户00200025004500
表(2)未几说了,上面入手下手在DataTable行转列示例:
//DataTable行转列
privateDataTableRCC(DataTable_outDataSource)
{
//从DataTable中读取不反复的日期行,用来机关新DataTable的列
DataTabledistinct_date=_outDataSource.DefaultView.ToTable(true,"日期");

DataTablenew_DataTable=newDataTable();

//将客户称号列增加到新表中
DataColumnnew_d_col=newDataColumn();
new_d_col.ColumnName="客户称号";
new_d_col.Caption="";
new_DataTable.Columns.Add(new_d_col);

StringBuilderstr_sum=newStringBuilder();

//入手下手在新表中机关日期列
foreach(DataRowdrindistinct_date.Rows)
{
new_d_col=newDataColumn();
new_d_col.DataType=typeof(decimal);
new_d_col.ColumnName=dr["日期"].ToString();
new_d_col.Caption=dr["日期"].ToString();
new_d_col.DefaultValue=0;
new_DataTable.Columns.Add(new_d_col);

//这个的目标是为算计列机关expression
str_sum.Append("+[").Append("日期").Append("]");
}

//将算计列增加到新表中
new_d_col=newDataColumn();
new_d_col.DataType=typeof(decimal);
new_d_col.ColumnName="Sum";
new_d_col.Caption="算计";
new_d_col.DefaultValue=0;
new_d_col.Expression=str_sum.ToString().substring(1);
new_DataTable.Columns.Add(new_d_col);

/*好了,到此新表已构建终了,上面入手下手为新表增加数据*/

//从原DataTable中读出不反复的客户称号,以客户称号为关头字来机关新表的行
DataTabledistinct_object=_outDataSource.DefaultView.ToTable(true,"客户称号");
DataRow[]drs;
DataRownew_dr;
foreach(DataRowdrindistinct_object.Rows)
{
new_dr=new_DataTable.NewRow();
new_dr["客户称号"]=dr["客户称号"].ToString();

foreach(DataRow_drindistinct_date.Rows)
{
drs=_outDataSource.Select("客户称号="+dr["客户称号"].ToString()+"and日期="+_dr["日
期"].ToString()+"");
if(drs.Length!=0)
{
new_dr.ToString()]=Math.Round(Convert.ToDecimal(drs["金额"]),2);
}
}
new_DataTable.Rows.Add(new_dr);
}

returnnew_DataTable;
}


从下面的代码中看到我们并没无为新表"算计"这一列赋值,这是由于该列具有表达式str_sum.Append("+[").Append("日期").Append("]"),以是这列的值是会主动添补的。

注重,在下面的表达式中,我们加了[],在DataTable的表达式中,假如列名是中文,必定要为列名加上[],要否则会报错的,这也是我调试了很久才发明的。有专家说:java不是跨平台,java就是平台,这很好的定义了java的特点。有了java,你只需要等待java平台在新平台上移植。这还不错吧!只是,java不是一个平台,而是多个平台。你需要在这个java平台移植到另一个java平台。

admin 发表于 2015-1-18 13:19:20

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

蒙在股里 发表于 2015-1-26 21:03:06

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。

变相怪杰 发表于 2015-2-4 21:41:56

PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。

冷月葬花魂 发表于 2015-2-10 19:30:54

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

飘飘悠悠 发表于 2015-3-1 15:10:28

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

乐观 发表于 2015-3-17 10:33:11

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

飘灵儿 发表于 2015-3-24 08:00:09

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
页: [1]
查看完整版本: 来一篇关于NET的C#中DataTable行转列示例