C# DataColumn.Expression能否使用sin/cos三角函数?如何设置浮点步长?
问题1:是否可以在DataColumn.Expression中使用sin、cos这类三角函数?
不可以。DataColumn.Expression 支持的内置函数是有限的,仅包含字符串处理、空值判断、类型转换、聚合类等少量函数,三角函数(sin/cos/tan等)不在官方支持的函数列表中,所以直接写会抛出未定义函数的错误。
如果需要实现自定义函数的计算,有两种常用方案:
- 放弃使用
Expression属性,自己遍历行计算y值,直接调用C#原生的Math类下的三角函数即可 - 如果需要支持用户输入任意表达式计算,可以使用Roslyn脚本API、或者第三方表达式解析库来完成计算后再赋值给y列
问题2:自动增长列的AutoIncrementStep是否支持设置浮点类型的步长?
不支持。AutoIncrementStep的属性类型本身是long,仅能接受整数值,无法设置浮点步长。如果需要非整数的x步长,不要将x列设置为自动增长列,在循环生成行的时候手动计算x值即可,灵活度更高。
调整后的可运行代码示例
static void Main(string[] args) { // 这里可以修改start、step为浮点类型,func为对应计算逻辑 DataTable table = MakeTable(-50, 0.5, x => Math.Sin(x)); DebugTable(table); } // 支持浮点步长、自定义函数计算 public static DataTable MakeTable(double startVal, double step, Func<double, double> func) { DataTable table = new DataTable("Coordinates"); // x列不再设置自动增长 DataColumn xColumn = new DataColumn { DataType = typeof(double), ColumnName = "x" }; DataColumn yColumn = new DataColumn { DataType = typeof(double), ColumnName = "y" }; table.Columns.Add(xColumn); table.Columns.Add(yColumn); // 手动循环计算x、y的值 double currentX = startVal; for (int i = 0; i <= 100; i++) { DataRow row = table.NewRow(); row["x"] = currentX; row["y"] = func(currentX); table.Rows.Add(row); currentX += step; } return table; }
如果需要保留用户输入字符串格式的函数,只需要额外加一步表达式解析,把字符串转成Func<double,double>委托即可。
内容的提问来源于stack exchange,提问作者user16817368
相关产品推荐
相关产品推荐

