我目前正在使用与此类似的函数计算几列数据。
DataTable data = RetrieveDataTable();
var value = data.Compute(
"AVG(Important_Variable)",
"(Distance > 1230 and Distance < 1760) OR (Distance > 4710 and Distance < 5400)"
);
这很有效,但速度很慢。有没有更快的方法来实现同样的事情?不同的数据类型是完全可以的,我没有与DataTables结婚。
答案 0 :(得分:2)
我不知道你是如何填充你的DataTable的,但我刚刚想到的一种方法是在填充DataTable时累积元素的总和和数量(你需要计算平均值) 。如下所示:
int sum;
int count;
for(something) //Loop that populates the data table
{
.
.
var Important_Variable = Read something
Populate(Important_Variable)
count++;
if((Distance > 1230 and Distance < 1760) || (Distance > 4710 and Distance < 5400))
sum += Important_Variable;
.
.
}
var avg = sum/count;
这样你就不必在事后运行过滤器(我很确定这是一个耗时的部分)。
答案 1 :(得分:1)
这是一个~basic~ORM映射器(Aka,创建你的POCO)
Why is DataTable faster than DataReader
使用对象的其他属性的readonly(get; only)属性。
如果你的计算是“昂贵的”,并且你读了不止一次,你可以使用这个“可空”的技巧。
public class Employee
{
public DateTime BirthDate { get; set; }
public DateTime HireDate { get; set; }
TimeSpan? _difference = null;
public TimeSpan Difference
{
get
{
TimeSpan returnValue;
if (this._difference.HasValue)
{
returnValue = this._difference.Value;
}
else
{
/* COSTLY CALCULATION HERE , ONE TIME */
this._difference = this.HireDate.Subtract(this.BirthDate);
/* End COSTLY Calculation */
returnValue = this._difference.Value;
}
return returnValue;
}
}
}