最近因为项目需要,继而转战到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的内容。
欢迎大家一起学习并指正,谢谢!