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的内容。


欢迎大家一起学习并指正,谢谢!


原创粉丝点击