C#DataSet操作for与foreach的区别
来源:互联网 发布:网络嗅探器免费版 编辑:程序博客网 时间:2024/05/17 00:50
最近因为项目需要,继而转战到C#的探索中,我想在C#中数据集操作是非常频繁的,在学习过程中我遇到了一些问题,所以记录下来以免以后忘记,同时也希望帮助到有需要的人!
在操作DataSet中我们怎么来遍历一个数据集呢,一般我们会这么做:
private void WeightsNormalized(DataSet ds) { foreach (DataTable dt in ds.Tables) //遍历所有的datatable { foreach (DataRow dr in dt.Rows) { //TODO } } }
这样做确实非常简单上手,我们还有另外一种操作方式,是这样的:
private void WeightsNormalized(DataSet ds) { for (int i = 0; i < ds.Tables.Count; i++) { for (int index = 0; index < dt.Rows.Count;index++) { //TODO } } }对于只对数据读取而言,以上两种方法都是正确的,但对于特殊需要而言,这还是有区别的。
在最近的项目中涉及到了权重计算的算法问题,比如依据一个城市的人口密度算权重,最后算出来的权重之和竟然不是1,我想应该是浮点误差造成的。所以要进行特殊处理,即在计算最后一权重值时,用1减去前面的的权重和,即可解决最后权重和不为1的情况。
假设各个城市的权重值都以一个城市为一个DataTable为单位,存放在一个DataSet中,所有我要对整个DataSet进行遍历,对各个城市的权重进行归一化处理。
用第一种方法来做处理:
private void WeightsNormalized(DataSet ds) { foreach (DataTable dt in ds.Tables) //遍历所有的datatable { double tempSum = 0.0; int index = 0; foreach (DataRow dr in dt.Rows) { if (index < dt.Rows.Count - 1) { tempSum = dt.Rows.Count + double.Parse(dr["Weights"].ToString()); } else { double endWeights = 1 - tempSum; dr["Weights"] = endWeights.ToString(); } index++; } } }
这样看似没有什么问题,但是最后在运行时,计算结果就不正确了,所有值都乱了。这是为什么呢?我想应该是foreach这种遍历方法不是取地址,而是拷贝,所以达不到预期的效果。所以我就采用了第二种方法:
private void WeightsNormalized(DataSet ds) { for (int i = 0; i < ds.Tables.Count; i++) { DataTable dt = ds.Tables[i]; double tempSum = 0.0; for (int index = 0; index < dt.Rows.Count;index++) { if (index < dt.Rows.Count - 1) { tempSum += double.Parse(dt.Rows[index]["Weights"].ToString()); } else { double endWeights = 1 - tempSum; dt.Rows[index]["Weights"] = endWeights.ToString(); } } } }
果不其然,最后的运行结果,达到了我想要的效果,可以在遍历的时候改变了DataSet的内容。
欢迎大家一起学习并指正,谢谢!
阅读全文
0 0
- C#DataSet操作for与foreach的区别
- for 与foreach 的区别
- foreach与for的区别
- <c:forEach></c:forEach>嵌套的用法与for的区别
- foreach与for用法的区别
- foreach语句与for语句的区别
- 数组遍历for与foreach的区别
- java中for与foreach的区别?
- for 与 foreach主要区别
- C#for和foreach的区别-----dictionary遍历的方式
- foreach和for的区别
- for和foreach的区别
- foreach和for的区别
- for和foreach的区别
- for 和 foreach 的区别
- for 和foreach的区别
- foreach和for的区别
- for与foreach遍历二维数组的语法区别
- C++内联函数
- TCP/IP学习笔记(4)-ICMP协议,ping和Traceroute
- Java 并发编程:volatile的使用及其原理
- 大数据的概述
- 写给自己的博客
- C#DataSet操作for与foreach的区别
- define const enum 三者的区别
- 图像特效之连环画
- 268. Missing Number
- Linux基本操作命令
- [BZOJ]3991 [SDOI]2015 寻宝游戏 虚树
- 【20170927】Java每日一练
- 邮票
- Python 读取EXCEL(XLS、CSV)写入txt文件